2012-11-27 69 views
4

我在我的項目中使用C++和Qt,而我的問題是QObject :: connect函數沒有將信號連接到插槽。我有以下類:QObject ::連接沒有連接信號到插槽

class AddCommentDialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    ...some functions 

signals: 
    void snippetAdded(); 

private slots: 
    void on_buttonEkle_clicked(); 

private: 
    Ui::AddCommentDialog *ui; 
    QString snippet; 
}; 

我的主窗口的一部分:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void commentAddedSlot(); 
    void variableAddedSlot(); 
    ... 

private: 
    AddCommentDialog *addCommentDialog; 
    ... 
}; 

螞蟻最後一個對話框;

class AddDegiskenDialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    ... 

signals: 
    void variableAdded(); 

private slots: 
    void on_buttonEkle_clicked(); 

private: 
    Ui::AddDegiskenDialog *ui; 
    ... 
}; 

在主窗口中構造我連接信號和槽:

addCommentDialog=new AddCommentDialog(); 
addDegiskenDialog=new AddDegiskenDialog(); 

connect(addDegiskenDialog, SIGNAL(variableAdded()), this, SLOT(variableAddedSlot())); 
connect(addCommentDialog, SIGNAL(snippetAdded()), this, SLOT(commentAddedSlot())); 

的一點是我的commentAddedSlot連接到它的信號成功,但commentAddedSlot失敗。 有Q_OBJECT宏,沒有警告,如關於​​沒有x插槽。除此之外, 接收器(信號(snippetAdded()))給我1但接收器(SIGNAL(variableAdded()))給我0,我使用命令qmake -project; qmake並使其完全編譯。 我錯過了什麼?

+0

您是否嘗試過點擊Build - >運行qmake(在Qt Creator中)並清理,重建您的項目? 你的輸出窗口顯示什麼? –

+0

是的,試過了,但沒有解決。我用插槽中的qDebug()打印,但它們不被信號調用。 –

+0

我剛剛使用你的代碼和連接工作正常。必須有其他事情正在進行。你以後是否可能重新初始化'addDegiskenDialog'? –

回答

3

快速查看你的代碼並不能解釋你的問題。

但是,這裏有一些時刻:

  1. 正如邁克說here:隨着連接問題,始終確保您檢查控制檯有關連接失敗的消息。由於Qt直到運行時才能確定連接是否有意義,它會通知您那裏出現故障。你會認爲它會崩潰,但它只是在控制檯中悄悄地說這些東西。使用Qt時,始終注意控制檯是有意義的。 Qt會打印出各種錯誤信息,這些錯誤信息可以在出現問題時提供幫助。
  2. 您可以控制connect功能的結果,所以(從官方文檔)

    的功能,如果它成功地將信號連接到 插槽返回true。如果它不能創建連接,則返回false,例如,如果QObject無法驗證是否存在信號 或方法,或者它們的簽名是否不兼容,則爲 示例。

  3. 檢查您的對象(對話框)是否創建良好並且指針不等於NULL

  4. 嘗試清除您的項目(QtCreator中的「Clear project」命令),甚至手動刪除所有ui_*moc_*。然後重新編譯它。

祝你好運!並且,請給我們反饋。

+2

在我的Qt信號插槽清單中,我還使用* Qt Creator *自動完成'SIGNAL'和'SLOT'宏。如果它不能這樣做,那麼代碼中就有問題了。還消除了拼寫錯誤,否則將只在運行時捕獲。 – hyde

+0

用Qt :: DirectConnection測試它是否存在踩點問題。 – JustMaximumPower

+0

感謝您的建議。這裏是反饋; 1-在控制檯中沒有警告說沒有這樣的插槽或類似的東西。 2-I打印出連接功能的結果。兩個連接都返回true,這意味着信號連接到插槽。 3我的對話框對象不爲空。我用if(addDegiskenDialog == NULL)對它進行了測試。 4 - 我清理了這個項目。即使我刪除了所有的生成目錄,但錯誤仍然存​​在。 –