2010-04-08 17 views
2

J'ai une QMainWindow qui engendre quelques assistants. QMainWindow possède une classe QFrame qui répertorie une collection d'objets. Je veux lancer cette fenêtre depuis les QWizardPages de mon assistant.Façon correcte de relayer les signaux à travers les classes en qt4?

Fondamentalement, j'ai besoin de connecter un signal à un slot dans le grand parent. La façon la plus évidente à faire ce serait:

MyMainWindow *mainWindow = qobject_cast<MyMainWindow *>(parent->parent()); 

if(mainWindow) 
{ 
    connect(button, SIGNAL(clicked()), mainWindow, SLOT(launchWidgetOne())); 
} else 
{ 
    qDebug() << "Super informative debug message"; 
} 

Être nouveau à Qt4, je me demande si traversant l'arbre parent et qobject_cast sont les meilleures pratiques ou s'il y a un autre moyen de faire ce qui est plus recommandé?

Répondre

2

Il y a plusieurs façons de faire cela qui sont un peu plus propres. Une façon est que vous pouvez modifier l'Assistant pour prendre un pointeur vers la classe MyMainWindow. Ensuite, vous pouvez faire la connexion un peu plus propre.

class Page : public QWizardPage 
{ 
public: 
    Page(MyMainWindow *mainWindow, QWidget *parent) : QWizardPage(parent) 
    { 
     if(mainWindow) 
     { 
      connect(button, SIGNAL(clicked()), mainWindow, SLOT(launchWidgetOne())); 
     } else 
     { 
      qDebug() << "Super informative debug message"; 
     } 
    } 
    // other members, etc 
}; 

Une conception beaucoup plus simple consiste simplement à propager le signal. Après tout, si le clic de ce bouton est important pour le parent, laissez le parent manipuler:

class Page : public QWizardPage 
{ 
public: 
    Page(QWidget *parent) : QWizardPage(parent) 
    { 
     connect(button, SIGNAL(clicked()), this, SIGNAL(launchWidgetOneRequested())); 
    } 
signals: 
    void launchWidgetOneRequested(); 
}; 

void MyMainWindow::showWizard() // or wherever you launch the wizard 
{ 
    Page *p = new Page; 
    QWizard w; 
    w.addPage(p); 
    connect(p, SIGNAL(launchWidgetOneRequested()), this, SLOT(launchWidgetOne())); 
    w.show(); 
} 

Je recommande vivement la deuxième approche, car il réduit le couplage où l'enfant aurait besoin de connaître les détails de la société mère .

+0

Je considérais la deuxième méthode, mais je ne savais pas si ce niveau de passage de signal était conseillé/bonne pratique. Merci d'avoir éclairci ça. – jkyle