2011-03-25 39 views
1

私のQtアプリケーションで親クラスにアクセスするにはどうすればいいですか?Qt4:親クラスにアクセスする最善の方法(1レベル上、2レベル上...)

mainWindow: MainWindow 
    tabWidget: QTabWidget 
     tab1: MySubClass1 
     tab2: MySubClass2 
      tabWidget: QTabWidget 
       xtab1: MySubSubClass1 
       xtab2: MySubSubClass2 

それは少し単純化している: は私のプロジェクトは、以下の構造を有しているとしましょう。 私がしたいのは、xtab2スロット機能の1つからmainWindowsオブジェクトにアクセスすることです。

(1)どのような方法が最適でしょうか? ツリーに沿ってmainWindowへのポインタを渡そうとしましたが、ランタイムエラーが発生します。

(2)xtab.hファイルにmainwindow.hを含めるか、xtab.cppファイルで行う必要がありますか?助けのための

感謝:)

答えて

2

あなたがメインウィンドウオブジェクトを返しますメインウィンドウ内の静的メソッドとオブジェクトを作成することができます。このような

何か:

private: 
    static MainWindow* _windowInstance 

public: 
    static MainWindow* windowInstance() 
    { 
      return _windowInstance; 
    } 

これは、ほとんどの場合、最も単純な解決策のようです。このオブジェクトにアクセスする必要があるときはいつでもmainwindow.hをインクルードするだけです。

このように、_windowInstanceをコンストラクタで初期化することを忘れないでください。

_windowInstance = this; 
+0

これは(-1) –

1

親クラスとは、親ウィジェットを意味しますか?

トップレベルのウィジェットを検索する場合は、QWidget::window()が表示されます。 dynamic_castまたはqobject_castを使用してMainWindowオブジェクトに変換します。

任意のレベルを上げたい場合は、paerntWidget()を使用してください。

3

MainWindowが本当に必要な場合は、MainWindowポインターを渡すことが最良の方法です。静的メソッドには、複数のメインウィンドウでの作業が停止するという欠点があります。

私は含まれているウィジェットからメインウィンドウにアクセスすることを避け、代わりにシグナルを使用することをお勧めします。例えば:

class MainWindow { 
    public: 
     explicit MainWindow(QWidget* parent=0) { 
      tab = new TabWidget; 
      ... 
      MySubSubClass1* ssw1 = new MySubSubClass; 
      connect(ssw1, SIGNAL(textChanged(QString)), this, SLOT(page1TextChanged(QString)); 
      tab->addWidget(ssw1); 
     } 

    private Q_SLOTS: 
     void page1TextChanged(const QString&) { 
      //do something... 
     } 
}; 

MySubSubClass1次いでtextChanged()を発する、addresseeChanged()(例えば、アドレス帳に)、又は抽象または詳細のどのレベルより高いレベルで理にかなっています。そうすれば、MySubSubClassは汎用的であり、MainWindowについて全く知る必要はありません。これは他のコンテキストで再利用することができます。 MySubSubClass自体に他のウィジェットが含まれている場合は、再びそのウィジェットに接続できます。

0
QWidget* parent = this ; 
while (parent -> parentWidget()) parent = parent -> parentWidget() ; 
1

この問題の異なる様々なソリューションがありますが、あなたは答えとして選んだ1は、オブジェクト指向とカプセル化に悪いものの一つという点です。いくつかの考え

  • カプセル化:あなた自身が(コンテナやサブクラスの長鎖ダウン)の関係で大きな距離accrossのアクセスを提供することを見つける場合は、配布しようとしている機能で見たいと思うかもしれません。私は、それが現在位置している場所(あなたのケースのメインウィンドウ)よりも簡単に渡すことができるクラスでカプセル化する必要があるかもしれません。

  • 抽象化:それはあなたがあなたのMainWindowクラスへのポインタを渡していないアクセスする必要QMainWindowの機能が実際にある場合を除き、あなたのメインウィンドウは、そのインターフェイスを実装し、周りに合格している、あなたが必要とする機能のためのインタフェースを作成し、 MainWindow型ではなくインターフェイス型のオブジェクトです。

  • シグナルとスロットは:フランクは述べたように、Qtのシグナリングメカニズムを使用して適切な機能を実装し、これは再び、実際のメイン・ウィンドウクラス

  • はQApplicationから分離、動的一つに発呼者と被呼者との間の接続を行います:絶対にグローバルな情報を持ってエントリポイントを制限する必要がある場合は、すでにQApplicationオブジェクトを1つだけ持ち、グローバルにアクセス可能でなければならない他のすべてのオブジェクトのメンテナにし、独自のQApplicationクラスを派生させ、 。 QApplicationクラスは、必要なグローバルオブジェクトを作成または破棄できます。あなたがメインウィンドウのインスタンスまたは何に何をする必要があるかについてのより多くの情報を

はあなたにも、より良い答え

+0

感謝に入るために本当に悪い習慣ですを取得する通信する必要がありますあなたは答えます。私は私のプロジェクトではQMainWindowが1つしかないので、静的関数のアプローチを使用することに決めました。しかし、今では、アプリケーションロジックをウィンドウインプリメンテーションから分離する方が良いかもしれません。 –