2009-08-17 7 views
3

Je peux définir le texte de la barre d'état du parent avec cette fonction, j'ai écritDéfinir le texte de la barre d'état du parent?

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

Appelé comme celui-ci (de l'enfant)

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

Mais je suis assez sûr que casse quelques principes de conception. Par exemple, que se passe-t-il si parent() n'est pas un EditorWindow*?

Alors, quelle est la solution pour cela? Forcer l'utilisateur à passer une référence à un EditorWindow lors de la création pour s'assurer que le parent est du type correct?

Répondre

9

Utiliser des signaux et des emplacements;

Rendez EditorWindow::setStatusBarText un emplacement. Donnez un signal à l'enfant lorsqu'il veut changer d'état et connectez-le à l'emplacement 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))); 
    ... 
} 

Puis l'enfant emit statusEvent(somestring) lorsque l'état doit être mis à jour. Ceci évolue bien, vous pouvez avoir autant de widgets enfants que vous le souhaitez avec la possibilité de changer le statut du texte, ils ne savent rien de leur widget parent, et vous pouvez implémenter une politique dans le widget parent pour accepter ou refuser des mises à jour d'état à partir de widgets enfants.

+0

Oh! Je commençais juste à penser aux signaux/slots mais je l'avais en arrière dans ma tête. Je peux le connecter dans le parent et cela allège le problème. Brillant! Merci :) – mpen

+2

Vous n'avez pas réellement besoin de la fonction setStatusBarText, vous pouvez utiliser showMessage directement: connect (editorView, SIGNAL (statusBarUpdate (QString)), statusBar(), SLOT (showMessage (QString))); – mpen

+0

@Mark - Pensez-y comme le recv doit autoriser la connexion et il doit avoir l'emplacement. Le signal peut provenir de n'importe où et pourrait ne jamais exister ou ne jamais être utilisé. –

Questions connexes