2010-04-08 56 views
2

我有一個產生一些嚮導的QMainWindow。 QMainWindow有一個QFrame類,它列出了一系列對象。我想從我的嚮導的QWizardPages中啓動這個窗口。在qt4中跨類傳遞信號的正確方法?

基本上,我需要連接一個信號到盛大父母的一個插槽。最明顯的方式做到這一點是:

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是最佳做法或建議,如果有這樣做的另一種方法是比較?

回答

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(); 
} 

我強烈推薦第二種方法,因爲它降低耦合那裏的孩子需要知道父的細節。

+0

我正在考慮第二種方法,但不確定信號傳遞的級別是否被建議/良好實踐。感謝您解決這個問題。 – jkyle 2010-04-08 23:53:40

相關問題