Qt自定义小部件不显示子小部件

时间:2014-08-31 22:30:36

标签: c++ qt widget

我有一个带有一些标准子窗口小部件的自定义窗口小部件。如果我创建一个单独的测试项目并重新定义我的自定义小部件以继承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上。

2 个答案:

答案 0 :(得分:3)

您错过了顶级布局:

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()));
}

请注意,创建QLayout时会自动完成setLayout(使用父窗口小部件)

答案 1 :(得分:1)

您希望在Controls类上设置布局以管理其子级。我建议删除你的框架小工具。

<强> controls.cpp

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

<强>的main.cpp

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

  MainWindow w;

  w.show();

  return app.exec();
}