2009-05-14 12 views
2

QMainWindowを使用して、実行時の外観を変更することができます。つまり、ユーザーがボタンをクリックしたときです。 QtDesignerによって生成された異なるUIクラスへの参照を保持することに加えて、これを行う別の方法はありますか?たぶんレイアウトに各UIを格納することによって?どう思いますか ?QMainWindowに複数のUIを追加するにはどうすればよいですか?

答えて

1

私は今それを得たと思う。

QMainWindowがあり、特定のイベントがトリガされたときに、特定のウィンドウの外観を変更したい場合、いくつかのボタンを削除するか、ツリービューウィジェットを追加するか、そうでないものを追加します。

まあまあのアプローチは、手作業で行い、いくつかのウィジェットを削除し、通常のC++コードを使って新しいものを追加することです。 Qt Designerに慣れていれば、これは難しいことです。

他の方法として、Qt Designerを使用して他の外観のコードを生成し、それを特別な機能にコピーする方法が考えられます。 Qt Designerによって生成されるコードは、通常、「ui_classname.h」というヘッダーファイルにあり、理解しにくいものではありません。しかし、すべてが必要ではないので、いくつかを削除する必要があります。

Qt Designerから生成されたコードをコピーする代わりに、単にそれを呼び出すこともできます。通常、あなたのウィジェットは、生成されたクラスへのポインタを持っており、あなたのウィジェットのコンストラクタで、あなたはこのような何かを参照してください。

MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MyWindow) 
{ 
    m_ui->setupUi(this); 
} 

を、対応するヘッダファイルで:

class MyWindow : public QMainWindow { 
... 
private: 
    Ui::MyWindow *m_ui; 
}; 

あなたはのための追加生成されたクラスを追加することができます他の外見はあなたのイベントがトリガするときに使用します。

それは次のようになります。

class MyWindow : public QMainWindow { 
... 
private: 
    void changeAppearance(int id); 

    Ui::MyWindow *m_ui; 
    Ui::MyWindowFirstAppearance *m_uiFirst; 
    Ui::MyWindowSecondAppearance *m_uiSecond; 
... 
}; 

void MyWindow::changeAppearance(int id) 
{ 
    // some code to remove the current appearance, basically the opposite of what setupUi is doing 
    if (id == 0) 
      m_ui->setupUi(this); 
    else... 
      m_uiFirst->setupUi(this); 
    ... 
} 

これは、あなたがQtのデザイナーで行うすべての変更は、あなたのメインウィンドウへの変更を必要とせず、直接生成されたクラスを使用することの利点を持っています。問題は、setupUiを複数回呼び出すことが合法であるかどうか、ウィジェットのコンストラクタ以外の場所ではわからないため、(setupUi関数で何が起きているのかを見て)チェックする必要があります。

+0

これは私がこれまで使用してきたアプローチですが、そのことは外観に言及する必要があることです。ありがとう! – Geo

1

実行時に動的にUIレイアウトを読み込むことができます。 QUiLoaderクラスについてはQt documentationをチェックしてください。

これにより、1行のコードを変更せずにUIレイアウトをアップグレードすることもできます。

+0

解決策ですが、非常に遅いです。これを達成する他の方法を考えてもいいですか? – Geo

+0

残念ながら。あなたはいつでもqtcentre.orgで尋ねることができます。 –

0

私がこの権利を得ている場合は、style sheetsで略奪したいと思うかもしれません。 CSSと同様に、ウィジェットに「スキン」を持たせることができます。

私がこの権利を得ておらず、実行中の.uiファイルを生成し、QUiLoaderを使用してウィジェットを作成するとしたら、おそらくこれは間違った方法です通常のアプリケーションではそれが必要な理由を考えることができません。

+0

それをある種のタブ区画と考えてください。ただ、別のUIを同じタブに表示しなければならないということです。 – Geo

+0

私が正しく理解していれば、#1タブでいくつかのチェックボックスを選択し、次のタブの内容が変わります。その場合は –

+1

にQWizardが適切に鳴ります。 –

5

変更するメインウィンドウの量はどれくらいですか? QStackWidgetを変更したい場所を使用し、ボタンを押したときにウィジェットの表示ページを変更することができます。これは速やかに変更されますが、大規模で複雑なUIの場合は、両方のUIのウィジェットを同時に作成するため、起動時に若干遅くなることがあります。 (これを変更する方法もかなり簡単ですが、ほとんどの人にとっては簡単なことに複雑なものが加わります。)また、両方のレイアウトで同じデータを別の場所に配置する必要がある場合は、プログラムの実行中に両方のUIセットを最新の状態に保つオーバーヘッドが発生します。

+0

すべてのUIを変更したいと思います。同じウインドウ寸法(幅/高さ)を持つ、完全に異なるスクリーンと考えてください。 – Geo

0

は私がやっていることは...、二つの異なるQFrames下2つのUIを設計QMainWindowで一緒にレイアウトで2 QFramesを入れ、その後、(隠し)とshow()あなたが欲しい正しいQFrameことです

0

QTabWidgetを使用してボタンを非表示にすることができます。その後、tabWidgetの別のウィンドウで各GUIを設計できます。フレームを隠すことよりも、Qt Creatorウィンドウを乱雑にしないという利点があります。

関連する問題