8

QMainWindow インスタンスを別の QWidget 内に配置したいと思います (たとえば、別の QMainWindow の centralWidget)。

なぜうまくいかないのだろうか?QMainWindow は QWidget から直接継承します。別の QWidget 内に QWidget を配置すると、正常に動作します。

QMainWindow インスタンスを QTabBar に問題なく配置することがよくあります。

ps QMainWindow を使用する必要があるのはなぜですか? 垂直レイアウトを使用して、1 つのフォーム内に 2 つのウィジェットを配置したいと考えています。両方のウィジェットに、直接それらの上に個別のツールバーを配置したいと考えています。

QtCreator を使用してプレーン QWidgets 内にツールバーを配置する方法が他にあるのではないでしょうか?


編集

最初の例 (正常に動作します)

QWidget に基づいて新しいクラス/フォームを作成します。(QtCreator は、標準テンプレートに基づいて 3 つのファイル *.cpp、*.h、および *.ui を作成します)。

クラス宣言はこんな感じ

class NotesEditor : public QWidget
{
    Q_OBJECT

public:
    explicit NotesEditor(QWidget *parent = 0);
    ~NotesEditor();

private:
    Ui::NotesEditor *ui;
};

このウィジェットを使用して別のウィジェット内に配置しようとすると、正常に動作します。qtcreator の "promote to ..." 機能を使用しました - ここでは問題ありません。

2 番目の例 (機能しません)

QMainWindow に基づいて新しいクラス/フォームを作成します。(QtCreator は、標準テンプレートに基づいて 3 つのファイル *.cpp、*.h、および *.ui を作成します)。

クラス宣言は次のようになります。

class Notes : public QMainWindow
{
    Q_OBJECT

public:
    explicit Notes(QWidget *parent = 0);
    ~Notes();

private:
    Ui::Notes *ui;
};

そして今、このウィジェットを別のウィジェットに配置しようとすると、表示されません。以前と同じように、qtcreator の "promote to ..." 機能を使用しました。

両方のウィジェット (最初は QWidget に基づいており、2 番目は QMainWindow に基づいています) は、標準の qtcreator コード テンプレートに基づいた同じデフォルト構造を持っています。ここではあまり変更していません。フォーム デザイナーにいくつかのボタンを追加しただけです。

2 番目の例では、クラス インスタンスで setEnabled(true) と setVisible(true) を使用しようとしました。最初のものは結果を与えません。2 つ目は、このウィジェットを別のウィンドウで開きます。


大きな問題は、QMainWindow を別の QWidget 内にネストすることを禁止するものだと思います。前に書いたように、QMainWindow インスタンスは問題なく QTabWidgets 内に配置できます。

4

3 に答える 3

14

同じ問題を抱えて、私はここで解決策を見つけました。

QMainWindowはウィンドウタイプをQt::Windowに設定し、親がある場合でも独立したウィンドウに表示されるようにします(これは、QMainWindowでshow()を呼び出すことで確認でき、独自のウィンドウに表示されます)。行を追加してみてください

window->setWindowFlags(Qt::Widget);

QMainWindowを構築した後。

于 2012-08-08T08:14:34.170 に答える
3
centralwidget = new QMainWindow(this);
centralwidget->setWindowFlags(Qt::Widget);
setCentralWidget(centralwidget);

これは役立つはずです。

于 2012-02-22T06:49:43.797 に答える
-3

QMainWindowプラットフォームにとらわれない方法で、ツールバー、ステータスバー、メニューバーなどの事前定義されたものを提供します(手動の介入なしで「正しいことを行います」)。レイアウト内のボタンの束だけが必要な場合は、 を使用しますQWidget

各 QWidget を確認する必要がありますがQMainWindow has central、それ以外は問題ありません。

于 2011-06-14T14:32:29.627 に答える