2009-08-17 83 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 2009-08-17 06:20:06

+2

你實際上並不需要setStatusBarText函數,你可以直接使用showMessage:connect(editorView,SIGNAL(statusBarUpdate(QString)),statusBar(),SLOT(showMessage(QString))); – mpen 2009-08-17 07:30:45

+0

@Mark - 認爲它是recv必須允許連接並且它必須有插槽。信號可能來自任何地方,可能永遠不會存在或永遠不會被使用。 – 2011-03-02 21:51:41