Пересчет размера виджета Qt во время выполнения - PullRequest
2 голосов
/ 20 января 2012

У меня проблема с вычислением размера в Qt при добавлении новых виджетов во время выполнения.Я попытался проиллюстрировать проблему с сокращенной программой там.Надеемся, что это показывает ту же проблему, что и моя другая (более сложная) программа:

Когда виджет был показан, используя:

w->show();

... и некоторые новые виджеты добавляются впозже (возможно, w имеет макет), что я должен сделать, чтобы заново отобразить w и его родителей, чтобы учесть размер вновь добавленных дочерних виджетов?Мне нужно поведение, которое заключается в том, что пересчет размера распространяется вверх до ближайшего прокручиваемого объекта (или главного окна, если прокручиваемых объектов нет)

В приведенном ниже примере я создаю небольшую структуру виджетов: если вызовshow() (прокомментированный SHOW1) удаляется, затем вся структура виджета определяется перед первым вызовом show(), и все работает.НО: если я звоню show() (на SHOW1), то в последнем шоу не отображаются правильные вещи: кадр все еще слишком мал

 #include <QApplication>
 #include <QtCore>
 #include <QMainWindow>
 #include <QTabWidget>
 #include <QWidget>
 #include <QGroupBox>
 #include <QVBoxLayout>
 #include <QLabel>

 #include <stdlib.h>


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

    QTabWidget* node_tab_widget = new QTabWidget(main_window);
    node_tab_widget->setObjectName(QString::fromUtf8("tab_widget"));

    QWidget* w= new QWidget(node_tab_widget);
    node_tab_widget->addTab(w, "TAB");

    QGroupBox* group_widget = new QGroupBox("GROUPNAME", w);
    QVBoxLayout*  group_layout = new QVBoxLayout;
    group_widget->setLayout(group_layout);
    group_layout->addWidget((QLabel*)new QLabel(">>>>>>>>>>>>>>>>>>>>>>>>>here1"));

    main_window->show();  // SHOW1: If this one is commented, then OK!

    group_layout->addWidget((QLabel*)new QLabel("here2"));
    group_layout->addWidget((QLabel*)new QLabel("here2"));
    group_layout->addWidget((QLabel*)new QLabel("here2"));
    group_layout->addWidget((QLabel*)new QLabel("here2"));

    main_window->setCentralWidget(node_tab_widget);

    // main_window->update();
    // main_window->hide();

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

1 Ответ

2 голосов
/ 20 января 2012

Ваш w виджет не имеет макета.Попробуйте добавить следующие строки после создания group_widget:

QVBoxLayout *wlayout = new QVBoxLayout(w);
wlayout->addWidget(group_widget);
wlayout->addStretch();

Вы можете избавиться от addStretch, если вы действительно хотите, чтобы w охватывал весь родительский элемент.

...