2012-01-20 96 views
2

在運行時添加新窗口小部件時,我在Qt中計算大小時遇到​​問題。 我試圖說明那裏的修剪程序的問題。我們希望,這顯示出比我的其他(更復雜)的程序相同的問題:運行時Qt窗口小部件大小重新計算

當構件已被證明,使用:

w->show(); 

......以及一些新的小部件添加到它以後(可能w有佈局), 我應該怎麼做才能重新顯示w及其父母,以便將新添加的子窗口小部件的大小考慮在內? 我想要的行爲是大小重新計算向上傳播到最近的滾動對象(或如果不存在滾動對象主窗口)

在下面的例子中,創建了一個小部件的結構:如果調用show() (註釋SHOW1)被刪除,然後在第一次調用show()之前定義了整個構件結構,並且一切正常。 但是:如果我不叫show()(在秀王),那麼最後顯示不顯示正確的事:框架還是太小

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

我會稍微提交一個更詳細的答案。簡單地說:我相信解決方案將依賴任何子部件,這些子部件決定父級的大小,並且提供合理的['minimumSize'](http://developer.qt.nokia .com/doc/qt-4.8/qwidget.html#minimumSize-prop)。 – sjwarner

+0

一個小點,但我建議你儘量保持你的編碼風格一致。您在該代碼中使用了三種不同形式的'new':'new(QMainWindow)','new QTabWidget(main_window)'和'new QVBoxLayout'。您可能會發現[此問題的](http://stackoverflow.com/q/1885849/594137)答案是有用的。 –

回答

2

w部件沒有佈局。嘗試創建group_widget後加入以下幾行:

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

可以擺脫addStretch,如果你真的想w跨越整個父。

+0

謝謝,這個工作。雖然我不清楚爲什麼需要在包含另一個獨特小部件的小部件上進行佈局......我知道佈局是用於組織子小部件的,但是很明顯,還有更多的事情正在進行。如果你有一分鐘​​的話,歡迎你解釋一下。 非常感謝,無論如何。 – user1159290

+0

如果您的窗口小部件A包含在窗口小部件B中而沒有佈局,那麼它只會停留在座標0,0處,無論它創建的是什麼樣的初始大小。有一個佈局確保它被適當調整大小,它有正確的邊距,等等...... –

+0

非常感謝。/CH。 – user1159290

相關問題