在qt4中跨类传递信号的正确方法?

时间:2010-04-08 15:16:54

标签: qt4 signals slots

我有一个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 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点,有点清洁。一种方法是您可以更改向导以获取指向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();
}

我强烈推荐第二种方法,因为它减少了孩子需要知道父母细节的耦合。