2010-11-27 13 views
0

GTKでは、gtk_container_add()がGtkVBoxを持つウィンドウを使用していました。その後、GtkVBoxにウィジェットを入れて、ウィンドウに表示させることができました。GtkVBox Qt相当

今Qtを試してみることにしましたが、Qtでこれを行う方法がわかりません。

私がやったことは、QMainWindowを作成することですが、明らかに非常に限定されている1つのメインウィジェットしかパックできないことがわかりました。だから、私はGtkVBoxのようなものを作成し、それをメインウィジェットとして使用し、このウィジェットに他のウィジェットを追加したいと考えました。

私がGoogle検索で見つけたのは、私が欲しいものだが、廃止予定のQ3VBoxウィジェットと、QVBoxLayoutだけです。

私はQVBoxLayoutを使用しようとしましたが、すでにQMainWindowのレイアウトを変更できないことがわかりました。

編集:ここでは(これはコンストラクタである)私はそれを行う方法です。

box = new QVBoxLayout; 
setLayout(box) 

それは罰金コンパイルが、実行時に、それがコンソール上に出力します。 QWidget::setLayout: Attempting to set QLayout "" on HCGWindow "", which already has a layout (HCGWindowが私のアプリのウィンドウです

QtのGtkVBoxと似たようなものを作成するにはどうしたらいいですか?ソリューションがQ3VBoxの場合、どうして私はそれを使うべきですか?

おかげ

+0

メインウィンドウのレイアウトをどのように変更しますか?コンパイラが印刷するエラーを表示します。 – werehuman

+0

@werehuman:編集された質問です。実行時にエラーが表示され、コンパイルでは表示されません。 – houbysoft

答えて

2

実際には、Qt documentationが提供する推奨される解決策があります。

QVBoxLayoutを作成し、それに必要なウィジェットを追加する必要があります。その後、別の空のウィジェットでレイアウトを設定し、このウィジェットをQMainWindowサブクラスの中央ウィジェットとして設定します。ここでは、コードの例です:

QWidget* widget1 = new QWidget(); // This could be anything subclassing QWidget. 
QWidget* widget2 = new QWidget(); 

QVBoxLayout* layout = new QVBoxLayout(); 
layout->addWidget(widget1); 
layout->addWidget(widget2); 

QWidget* central = new QWidget(); // Only a containing QWidget. 
central->setLayout(layout); 

this->setCentralWidget(central); 

さて、あなたQMainWindowサブクラスはQVBoxLayoutに配置され、その中に2 QWidgetsを、持っている必要があります。

私は誰にも親を与えなかったことに注意してください。あなたはそれを行うことができましたが、addWidgetまたはsetCentralWidgetを呼び出すと、ウィジェット(およびレイアウト)の所有権が、そのクラスを含むクラスに与えられます。

Qtについて少し読んでみると、親が自分自身を破壊しようとしているときに親が子供を破壊できることがわかります。

最後に、QMainWindowは例外であり、私が知っているところでは、メソッドとしてsetCentralWidgetを持つ唯一のクラスであることに注意してください。 QWidgetサブクラスを作成しようとすると、上記の例のようにsetLayoutを使用することができます。

これが役に立ちます。

+0

ありがとう!私は非難のメモを見てもこれを見つけました。それは私が使ったものです。 – houbysoft

0

は、メインウィンドウのレイアウトに(交換しないで)このレイアウトを、QVBoxLayoutインスタンスを作成し、それをあなたのウィジェットを追加し、追加してみてください。

注:QLayoutクラスにはメンバーaddLayoutはありませんが、サブクラスには1があります。

まず、あなたが取得し、メインウィンドウのレイアウトのクラス名を覚えておく必要があります。

qDebug(this.layout()->objectName); 

そして、ウィンドウのレイアウトにあなたのQVBoxLayoutを追加します。

dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object); 

私はそれが動作することを願っています。