【问题标题】:Qt custom widget not showing child widgetsQt 自定义小部件不显示子小部件
【发布时间】:2014-08-31 22:30:35
【问题描述】:

我有一个自定义小部件,里面有一些标准的子小部件。如果我创建一个单独的测试项目并重新定义我的自定义小部件以继承 QMainWindow,一切都很好。但是,如果我的自定义小部件继承了 QWidget,则窗口会打开,但里面没有子小部件。

这是代码:

controls.h:

#include <QtGui>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>

class Controls : public QWidget
{
    Q_OBJECT

public:
    Controls();

private slots:
    void render();

private:
    QWidget *frame;
    QWidget *renderFrame;
    QVBoxLayout *layout;
    QLineEdit *rayleigh;
    QLineEdit *mie;
    QLineEdit *angle;
    QPushButton *renderButton;
};

controls.cpp:

#include "controls.h"

Controls::Controls()
{
    frame = new QWidget;
    layout = new QVBoxLayout(frame);

    rayleigh = new QLineEdit;
    mie = new QLineEdit;
    angle = new QLineEdit;
    renderButton = new QPushButton(tr("Render"));

    layout->addWidget(rayleigh);
    layout->addWidget(mie);
    layout->addWidget(angle);
    layout->addWidget(renderButton);

    frame->setLayout(layout);
    setFixedSize(200, 400);

    connect(renderButton, SIGNAL(clicked()), this, SLOT(render()));
}

main.cpp:

#include <QApplication>
#include "controls.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Controls *controls = new Controls();
    controls->show();

    return app.exec();
}

这会打开一个尺寸正确但里面没有内容的窗口。

请记住,这是我使用 Qt 的第一天。我需要在不继承 QMainWindow 的情况下完成这项工作,因为稍后我需要将它放在 QMainWindow 上。

【问题讨论】:

    标签: c++ qt widget


    【解决方案1】:

    您缺少顶级布局:

    Controls::Controls()
    {
        ... (yoour code)
    
        QVBoxLayout* topLevel = new QVBoxLayout(this);
        topLevel->addWidget( frame );
    }
    

    或者,如果其他地方没有使用框架,直接:

    Controls::Controls()
    {
        layout = new QVBoxLayout(this);
    
        rayleigh = new QLineEdit;
        mie = new QLineEdit;
        angle = new QLineEdit;
        renderButton = new QPushButton(tr("Render"));
    
        layout->addWidget(rayleigh);
        layout->addWidget(mie);
        layout->addWidget(angle);
        layout->addWidget(renderButton);
    
        setFixedSize(200, 400);
    
        connect(renderButton, SIGNAL(clicked()), this, SLOT(render()));
    }
    

    注意 setLayout 是在创建 QLayout 时自动完成的(使用父窗口小部件)

    【讨论】:

    • 谢谢,成功了:)
    【解决方案2】:

    您需要在 Controls 类上设置一个布局以管理其子级大小。我建议删除您的框架小部件。

    controls.cpp

    Controls::Controls()
    {
      layout = new QVBoxLayout(this);
      .
      .
      .
    }
    

    ma​​in.cpp

    int main(int argc, char* argv[])
    {
      QApplication app(argc, argv);
    
      MainWindow w;
    
      w.show();
    
      return app.exec();
    }
    

    【讨论】:

    • 谢谢,现在好了:)
    • 没问题,如果你在Qt Creator中声明为指针,按'.',它会自动变成'->'