在show->()之后的Qt MDI区域子窗口构造无法更新窗口大小

时间:2012-02-01 16:14:05

标签: qt size

我有一个程序在QT MDI区域构建一个子窗口,显示它,然后更新该窗口的内容。 该程序很大,但我已尝试(并希望成功)在下面的小程序中重现该问题。 在程序的中间,有一行注释“如果这个被评论,那么OK!”。 如上所述,如果这一行被注释,则在Qt进入事件循环之前创建整个子窗口内容,一切都很好...... 但是:行是否存在,然后MDI子窗口的内容分两步构建(如我原来的程序),但只显示第一步中构建的内容!

运行下面的小程序... ...如果您现在抓住子窗口(使用鼠标),移动它,然后Qt突然意识到大小错误并更新子窗口内容......

我无法从头开始找出正确的方法。

我在linux(Fedora)上运行Qt 4.8.0-7。

 #include <QApplication>
 #include <QtCore>
 #include <QMainWindow>
 #include <QGroupBox>
 #include <QHBoxLayout>
 #include <QLabel>
 #include <QMdiArea>
 #include <QMdiSubWindow>

 #include <stdlib.h>

 QMdiArea* g1;
 QGroupBox* g1a;

 int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
    QMainWindow* main_window = new(QMainWindow);
    main_window->setObjectName("main_window");
    main_window->resize(200, 200);
    main_window->setWindowTitle("Hello");


    g1 = new QMdiArea(main_window);
    main_window->setCentralWidget(g1);

    main_window->show();

    g1a = new QGroupBox("G1A", g1);
    QVBoxLayout *g1a_l = new QVBoxLayout(g1a);
    g1a_l->addWidget(new QLabel("LABEL1"));

    QMdiSubWindow *sub_window = new QMdiSubWindow(g1);
    sub_window->setWidget(g1a);
    sub_window->setAttribute(Qt::WA_DeleteOnClose);


    app.processEvents();   //If this one is commented, then OK!

    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label2"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label3"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label4"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label5"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label6"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label7"));

    sub_window->show(); //How to I get that to recaclulate the size of its contents?
    return app.exec();
 }

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用adjustSize方法:

sub_window->show(); // here or after adjustSize
sub_window->adjustSize();

它将调整大小以适合sub_window内容(from documentation)。