2

いくつかのウィザードを生成する 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をトラバースすることがベストプラクティスなのか、それともこれを行うためのより推奨される別の手段があるのか​​ 疑問に思っていますか?

4

1 に答える 1

2

これを行うには、もう少しクリーンな方法がいくつかあります。1 つの方法は、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();
}

子が親の詳細を知る必要がある場合にカップリングを減らすため、2 番目のアプローチを強くお勧めします。

于 2010-04-08T20:25:58.573 に答える