2012-02-09 5 views
0

次のコードを実行すると、minimumSizeは新しく追加されたラベルを考慮しません。ラベルは、ウィンドウ内にコードが表示された後に追加され、ウィジェットはそれに応じてサイズを変更する必要があります。私は、ミリ秒のカップルを待って(最初のペイントが発生し、おそらく後)、のminimumSizeが正しいですが、私は私が表示されたときに...新しいラベルを追加した後に右の「W」QVBoxLayout addWidgetの後にminimumSizeが正しくない

#include <QApplication> 
#include <QtCore> 
#include <QWidget> 
#include <QVBoxLayout> 
#include <QLabel> 
#include <stdlib.h> 

/* This application prints the following output: 

label hint: 33x16 
layout: 24x24 
layout with label: 24x24 
layout with label (activated): 24x24 

And this comes out when the main_window->show() is executed last (this is correct): 

label hint: 33x16 
layout: 24x24 
layout with label: 57x40 
layout with label (activated): 57x40 
*/ 
int main(int argc, char *argv[]) { 

QApplication app(argc, argv); 
QWidget *main_window = new QWidget(); 

QWidget* w= new QWidget(main_window); 
w->move(20,20); 

QVBoxLayout *lay = new QVBoxLayout(w); 
// When this happens *after* widgets are added, the sizes are OK. 
// When we show the main window before, the sizes are wrong. Why ? 
main_window->show(); 

QLabel *lbl = new QLabel("Hello"); 
QSize sz = lbl->sizeHint(); 
printf("label hint: %ix%i\n", sz.width(), sz.height()); 

sz = lay->minimumSize(); 

printf("layout: %ix%i\n", sz.width(), sz.height()); 

lay->addWidget(lbl); 
// resizing 'w' here does not work because minimumSize is wrong... 
// w->resize(lay->minimumSize());  

sz = lay->minimumSize(); 
printf("layout with label: %ix%i\n", sz.width(), sz.height()); 

lay->activate(); 
sz = lay->minimumSize(); 
printf("layout with label (activated): %ix%i\n", sz.width(), sz.height()); 


// layout and label sizes are OK if this is executed here. 
//main_window->show(); 
return app.exec(); 
} 

メインウィンドウのサイズを変更したい場合()の追加ラベルの前に:

http://lubyk.org/en/image394_std.png?661680336517

とshow()が最後に表示され、同じこと:

http://lubyk.org/en/image395_std.png?661680336526

実際のユースケースは、Rubykのネットワーク上のリモートプロセスを表示する何らかの「ツール」ウィジェットです。これらのプロセスは行き来します。私がQHBoxLayoutを使用しているが、内部のマシンリストを使用すると、それは無駄な(そして醜い)すべての垂直スペースを使用します。フローティングウィジェットを使用することで、透明になり(見た目はきれい)、下のスペースを使用できます。

バグプロセスが表示されたら:

http://lubyk.org/en/image393_std.png?661680334439

PS: "ガスパール"

http://lubyk.org/en/image392_std.png?661680334428

正しい描画が(私はサイズ変更及びサイズの更新を強制的にメインウィンドウをサイズ変更しました)私のマシンのホスト名です。

答えて

2

...可視性の問題がトラブルを引き起こしていたまさにでし助けるために時間を割いて

lay->addWidget(lbl); 
lbl->show(); 
main_window->update(); 
+1

'lbl-> show()'は私のコードで見逃したものです。助けてくれてありがとう。 – gaspard

+0

lbl-> show();とても簡単!これを含む例はありません。明示的に必要とされるとは限りませんか? –

1

うーん...これは奇妙な問題です。私はコードを踏んだので、サイズがオフになっている理由はQLabelが見えないと考えられるからです。レイアウトにラベルを追加した後にlbl->setVisible(true)を追加すると、サイズは同じになります。

しかし、結果として得られたディスプレイは、まだまともに見えませんでしたが、少なくともこれで一歩近づくでしょうか?

また、最終的に達成しようとしていることを達成する次のコードもありますか?

#include <QtGui> 

class ToolWindow : public QDialog { 
    Q_OBJECT 
public: 
    ToolWindow(QWidget *parent = NULL) : QDialog(parent, Qt::Tool) { 
    QVBoxLayout *layout = new QVBoxLayout; 
    setLayout(layout); 
    } 
public slots: 
    void addButton() { 
    layout()->addWidget(new QPushButton("Hello, world")); 
    } 
}; 

#include "main.moc" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

    QMainWindow main_window; 
    ToolWindow tool_window; 

    QPushButton *button = new QPushButton("Push Me!"); 
    button->connect(button, SIGNAL(clicked()), &tool_window, SLOT(addButton())); 

    main_window.setCentralWidget(button); 

    main_window.show(); 
    tool_window.show(); 

    return app.exec(); 
} 
+0

感謝を試してみてください。ウィジェットを追加した後に 'lbl-> show()'を追加するだけで、私の問題が解決しました。 – gaspard

関連する問題