我有一个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是最好的做法,还是有另外一种方法可以做到这一点?
答案 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();
}
我强烈推荐第二种方法,因为它减少了孩子需要知道父母细节的耦合。