将小部件添加到布局仅适用于自定义类的构造函数

时间:2016-06-24 12:09:34

标签: c++ qt user-interface layout

我有一个MainWindow类继承QMainWindow。作为中央窗口小部件,我有一个带有QWidget的QScrollArea,作为我自己的自定义窗口小部件的容器。我将QVBoxLayout设置为QWidget容器的布局,并将此布局传递给我的自定义类的构造函数,该构造函数应该动态创建我的自定义窗口小部件类的实例并将它们添加到布局中。

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = Q_NULLPTR);
    virtual ~MainWindow ();
private:
    QVBoxLayout mainLayout;
    QScrollArea scrollArea;
    QWidget container;
    NotificationControl control;
};

MainWindow::MainWindow (QWidget *parent) :
    QMainWindow(parent),
    container(&scrollArea),
    control(&mainLayout) {
    container.setLayout(&mainLayout);
    scrollArea.setWidget(&container);
    setCentralWidget(&scrollArea);
}

现在我的NotificationControl类中有一个方法addNotification:

void NotificationControl::addNotification (Notification notif) {
    qDebug() << "NotificationControl addNotification" << notif.get_app_name();
    NotificationWidget* widget = new NotificationWidget(notif);
    container->addWidget(widget);
}

调用此方法时,我得到调试输出,但没有任何内容添加到布局中。但是如果我将它添加到NotificationControl的构造函数的末尾......

NotificationWidget* notif = new NotificationWidget(Notification());
container->addWidget(notif);

......出于某种原因,它有效。我很确定问题不在于NotificationWidget类。出于测试目的,我做了一些更改,它实际上并没有使用传递的Notification对象。

可能是什么问题?

编辑:我刚刚注意到稍后添加小部件(不在构造函数中)会使构造函数中添加的小部件消失。

1 个答案:

答案 0 :(得分:1)

如果父窗口小部件已经可见,则必须显式显示作为子窗口小部件添加的任何窗口小部件。通常,在显示父窗口小部件之前添加子窗口小部件,然后它们自己也可以看到。但如果您稍后添加它们,则必须明确显示它们。