2012-01-20 14 views
2

実行時に新しいウィジェットを追加するときに、Qtでサイズ計算に問題があります。 私はそこにあるプルーンされたプログラムの問題を説明しようとしました。うまくいけば、それは私の他の(より複雑な)プログラムよりも、同じ問題を示しています実行時のQtウィジェットサイズの再計算

ウィジェットが示されている

、使用して:

w->show(); 
...といくつかの新しいウィジェットが後でそれに追加されます(おそらく wにレイアウトがあります) wとその親を再表示して、新しく追加された子ウィジェットのサイズが考慮されるようにするにはどうすればよいですか?私が欲しい 挙動は(何のスクロールオブジェクトが存在しない場合、またはメインウィンドウ)サイズの再計算は、最寄りのスクロールオブジェクトに上向きに伝播していることである

以下の例では、私は少しウィジェット構造を作成します。show()に呼び出した場合(コメント付きのSHOW1)が削除されると、最初の呼び出しがshow()になる前にウィジェット構造全体が定義され、すべてが機能します。 しかし:私は(SHOW1で)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(QMainWindow)'、 '新しいQTabWidget(main_window)'、 'new QVBoxLayout'の3種類の' new'を使いました。あなたは[この質問の](http://stackoverflow.com/q/1885849/594137)の回答が役に立ちそうです。 –

答えて

2

あなたwウィジェットは、レイアウトを持っていません。 group_widgetを作成した後に以下の行を追加してみてください:

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

あなたが実際にwが全体の親にまたがるする場合は、addStretchを取り除くことができます。

+0

ありがとう、これは仕事をしました。なぜ別のユニークなウィジェットを含むウィジェットにレイアウトを付ける必要があるのか​​私にはあまり明確ではありませんが...レイアウトは子供用ウィジェットの組織のものだと思っていましたが、明らかに多くのことが起こっています。 分がある場合は説明してください。とにかく、ありがとうございます。 – user1159290

+0

レイアウトを持たないウィジェットBにウィジェットAが含まれている場合、それは作成される初期サイズにかかわらず座標0,0のままです。レイアウトを持つことで、適切にリサイズされ、正しいマージンなどが確保されます。 –

+0

多くのおかげです。/ch。 – user1159290