qt4でクラス全体で信号を中継するための適切な方法はありますか?
質問
私はいくつかのウィザードを起動します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がより推奨されてこれを行うための別の手段があるかどう?
のベストプラクティスですか、解決
あなたは少しクリーナーであること、これを行うことができますいくつかの方法があります。一つの方法は、あなたが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
};
はるかに単純な設計だけで信号をアップpropogateすることです。すべての後に、そのボタンのクリックは、親にとって重要である場合は、親ハンドルを聞かせてます:
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();
}
私の高い子が親の詳細を知る必要があるだろう場所、それが結合減らすため、第二のアプローチをお勧めします。
所属していません StackOverflow