2010-03-23 60 views
2

我有一個的QMainWindow顯示了QDialog:無法連接的QMainWindow和QDialog的

CalibrationDialog d(this); 
d.exec(); 

我的QMainWindow類有一個信號:

signals: 
void PenOn(QPoint p); 

而且QDialog的有槽:

public slots: 
void on_PenON(QPoint p); 

我試圖連接PenOn事件on_PenOn在兩個方面:

  1. 實例化了QDialog

    void MainWindow::on_actionC_triggered() 
    { 
    appState = CALIBR; 

    CalibrationDialog d(this); 
    connect(this, SIGNAL(PenOn(QPoint)), &d,SLOT(on_PenOn(QPoint))); 
    d.exec(); 
    } 
  • 在QDialog的構造
  • 
        CalibrationDialog::CalibrationDialog(QWidget *parent) : 
         QDialog(parent), 
         ui(new Ui::CalibrationDialog) 
        { 
         ui->setupUi(this); 
    
         [...] 
    
         connect(parent, SIGNAL(PenOn(QPoint)), this,SLOT(on_PenOn(QPoint))); 
        } 
    

    無的這個作品:(。 我從另一個線程激活的MainWindow插槽發出PenOn信號。

    我在做什麼錯?

    +0

    不Qt的打印任何東西了,當您嘗試進行連接?它說什麼? (您可能需要建立在調試模式以獲得打印輸出。)我認爲這只是在第一時間問題的錯字,但我現在看到你申報你的插槽爲「on_PenON」(以一個大寫的最終N)和嘗試使用它作爲「on_PenOn」(小寫的最後n)。如果這與代碼中的相同,那就是問題所在,因爲信號/插槽區分大小寫。 – 2010-03-27 14:22:13

    +0

    對不起,但我不記得,我沒有舊的代碼,我試圖用適當的功能再次做它,它不工作。我不記得任何錯誤消息(來自編譯器) - 一切都是在調試模式下完成的。 – bartek 2010-03-29 11:40:27

    +1

    只是要清楚的事情,QT在調試模式下可當它試圖在運行程序*連接到信號*打印出一條消息,而不是當你編譯它。連接被視爲運行時事物,因此即使連接不正確,編譯也會成功。除此之外,我沒有想法。 – 2010-03-30 14:02:38

    回答

    0

    我認爲你需要使用一個阻塞直接連接,但要知道,該槽將在主窗口的線程中執行:

    connect(this, SIGNAL(PenOn(QPoint)), &d, SLOT(on_PenOn(QPoint)), Qt::BlockingQueuedConnection);

    更多信息,請參見http://qt.nokia.com/doc/4.5/qt.html#ConnectionType-enum

    對於connect方法使用默認Qt :: ConnectionType的問題是,由於對象在不同的​​線程中,只有當對話線程返回到它的主循環時纔會調用該插槽,該操作只發生在d.exec()循環完成。

    +0

    不幸的是,這不起作用。我有點困惑exec()方法。當exec被觸發時,父窗口仍然接收和處理來自工作線程的信號(沒關係),所以我不明白爲什麼對話窗口沒有接收到主窗口信號。 !中 一些調試後/ * \內部 */ 空隙QMetaObject ::激活 如果((發送者> d_func() - > connectedSignals [n]的&M)== 0)// 沒什麼連接到這些信號,並沒有間諜 返回; 返回true,方法返回。 – bartek 2010-03-24 07:20:17

    +0

    使對話非模態也不能解決問題。 – bartek 2010-03-24 07:47:38

    +0

    這裏的不同線程應該沒有問題,因爲這兩個類都是UI類,並且必須位於相同的(第一個)線程中。該信號的連接類型應該默認爲直接,這將立即調用它。 – 2010-03-26 14:36:14

    0

    仍然不知道發生了什麼事情。我利用QEvent並通過這種方式解決了問題。

    0

    我對這個問題的第一猜測是,你沒有Q_OBJECT宏在類中的一個,或可能兩者。如果你在生成你的makefile後添加它,你可能需要重新運行qmake來重新生成makefile(或者你在平臺上使用的任何東西),讓它知道moc需要在這些類上運行。如果moc未在您的類上運行,則不會生成將信號和插槽信息添加到類中所需的代碼,並且連接將失敗。

    +0

    嗨,不幸的是,這兩個類都有Q_OBJECT宏,事實上,這兩個頭文件都是由Qt Designer生成的,我試圖重新編寫整個項目。仍然沒有成功。幸運的是發送活動作爲魅力。 – bartek 2010-03-27 11:27:22