2009-08-17 4 views
3

私はこの関数で親のステータスバーのテキストを設定することができますが、私はこのように呼ばれ 親のステータスバーのテキストを設定しますか?

void EditorWindow::setStatusBarText(const QString& text) { 
    statusBar()->showMessage(text); 
} 

(子から)

((EditorWindow*) parent())->setStatusBarText(tr("%1, %2").arg(mousePos.x(), 0, 'f', 2).arg(mousePos.y(), 0, 'f', 2)); 

を書いたしかし、私はいくつかの設計原則を破ることかなり確信しています。たとえば、parent()EditorWindow*でない場合はどうなりますか?

これはどのような回避策ですか?親が正しいタイプであることを確認するために、作成時にユーザがEditorWindowへの参照を渡すように強制するか?

答えて

9

信号とスロットを使用します。

EditorWindow::setStatusBarTextをスロットにします。ステータスを変更したいときに子供に信号を与え、それをsetStatusBarTextスロットに接続します。

// make setStatusBarText a slot... 
class EditorWindow : public QWidget { 
    Q_OBJECT 
    ... 
    public slots: 
     void setStatusBarText(const QString&); 
} 

// make a signal to be emitted when status should change: 
class SomeChildWidget : public QWidget { 
    Q_OBJECT 
    ... 
    signals: 
     void statusEvent(const QString&); 
} 

// connect them up when appropriate 
EditorWindow::EditorWindow() 
: QWidget() 
{ 
    ... 
    m_childWidget = new SomeChildWidget(this); 
    connect(m_childWidget, SIGNAL(statusEvent(QString)), 
      this,   SLOT(setStatusBarText(QString))); 
    ... 
} 

ステータスを更新する必要がある場合、子はemit statusEvent(somestring)になります。

これはスケーラビリティがあり、ステータステキストを変更する機能を好きなだけ子ウィジェットを持つことができます。親ウィジェットについては何も知らず、親ウィジェットにポリシーを実装して受け入れることができます子ウィジェットからステータスの更新を拒否することができます。

+0

ああ!私は信号/スロットについて考え始めたばかりでしたが、私はそれを頭の中で逆向きに持っていました。私は親でそれを接続することができ、それは問題を緩和する。ブリリアント!ありがとう:) – mpen

+2

あなたは実際にsetStatusBarText関数を必要としません、あなたは直接showMessageを使用することができます:connect(editorView、SIGNAL(statusBarUpdate(QString))、statusBar()、SLOT(showMessage(QString))); – mpen

+0

@マーク - recvは接続を許可する必要があり、スロットを持っていなければならないと考えてください。信号はどこから来ても決して存在しないか、決して使用されないかもしれません。 –

関連する問題