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

Qt custom widget not showing child widgets

本文关键字:小部 显示 Qt 自定义      更新时间:2023-10-16

我有一个自定义小部件,里面有一些标准的子小部件。如果我制作一个单独的测试项目,并重新定义我的自定义小部件以继承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.cp:

#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上。

您缺少一个顶级布局:

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会自动完成

您需要在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();
}