qt4でクラス全体で信号を中継するための適切な方法はありますか?

StackOverflow https://stackoverflow.com/questions/2601090

  •  25-09-2019
  •  | 
  •  

質問

私はいくつかのウィザードを起動します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();
}

私の高い子が親の詳細を知る必要があるだろう場所、それが結合減らすため、第二のアプローチをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top