Правильный способ передавать сигналы через классы в QT4? - PullRequest
2 голосов
/ 08 апреля 2010

У меня есть QMainWindow, которое порождает нескольких волшебников. QMainWindow имеет класс QFrame, который перечисляет коллекцию объектов. Я хочу запустить это окно из QWizardPages моего мастера.

По сути, мне нужно подключить сигнал к слоту в прародителе. Наиболее очевидный способ сделать это будет:

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

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

Будучи новичком в qt4, мне интересно, лучше ли обходить родительское дерево и qobject_cast или есть другой способ сделать это, который рекомендуется?

1 Ответ

2 голосов
/ 09 апреля 2010

Есть несколько способов сделать это немного чище. Одним из способов является то, что вы можете изменить мастер так, чтобы он брал указатель на класс MyMainWindow. Тогда вы можете сделать подключение немного чище.

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
};

Гораздо более простой дизайн - просто распространять сигнал вверх. В конце концов, если нажатие этой кнопки важно для родителя, пусть родитель справится с этим:

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();
}

Я настоятельно рекомендую второй подход, так как он уменьшает сцепление, когда ребенок должен знать подробности родителя.

...