2010-04-09 55 views
8

我試圖在fridge magnets example的可拖動小部件之一發生雙擊時觸發信號。下面是我的示例源所做的更改:Qt - 沒有這樣的信號錯誤

DragLabel:

class DragLabel : public QLabel 
{ 
public: 
    DragLabel(const QString &text, QWidget *parent); 
    QString labelText() const; 

public slots: 
    void testSlot(){qDebug()<<"testSlot";} //<-- implemented this slot 

protected: 
    void mouseDoubleClickEvent(QMouseEvent *ev){emit testSignal();} //<-- overriden this method 

private: 
    QString m_labelText; 

signals: 
    void testSignal(); //<-- added this signal 

}; 

我在實現文件中唯一改變的是增加connect(this,SIGNAL(testSignal()),this,SLOT(testSlot()));到DragLabel的構造。

試圖編譯項目導致 '未定義的參考`DragLabel :: testSignal()' 和 'collect2:LD返回1退出狀態' 的錯誤。

當我註釋掉調用信號,它編譯和運行,但散發出「對象::連接:沒有這樣的信號QLabel :: testSignal()在draglabel.cpp」在應用程序輸出警告。顯然,testSignal()不被識別爲一個信號。

我試圖添加Q_OBJECT宏DragLabel但在4「未定義的參考`虛表的DragLabel」的結果「警告和」 collect2:LD返回1個退出狀態「的錯誤。

我錯過了什麼?

+0

您的示例代碼缺少Q_OBJECT宏調用,這可能是您的問題的原因。 – 2010-04-09 19:11:03

+0

噢,我忘了提及,我曾嘗試添加Q_OBJECT。我會在這個問題上加上這一點。 – 2010-04-09 19:20:04

回答

12

把Q_OBJECT宏在頂部,(一定要在第一類的事情,沒有「;」)

確認你完全重建時,VS-外接尤其是並不總是通知一個文件已經變成qt-aware而不需要重建。

更多的好建議20 ways to debug Qt signals and slots

+0

它是最後的宏觀。我不得不重新啓動我的電腦才能使用它,但清理和重建項目並未奏效。在重新啓動之前,Qt Creator不停地給出'ld返回1退出狀態'錯誤和vtable警告。真奇怪。 – 2010-04-09 19:47:19

+0

謝謝馬丁。你的鏈接拯救了我的生命。在我的情況下,對於同樣的錯誤,它是信號和插槽功能中的參數不匹配。 – 2011-12-01 07:53:48

+1

@Anisha Kaul - 信號/插槽是運行時間,所以編譯器不會注意到錯誤。今天我有一個信號名稱中間出現單個字母錯誤的情況! – 2011-12-01 16:32:25

0

它到底宏。我不得不重新啓動我的電腦才能使用它,但清理和重建項目並未奏效。在重新啓動之前,Qt Creator不停地給出'ld返回1退出狀態'錯誤和vtable警告。真奇怪。 - 大衛麥克戴維森

這並不奇怪,它是愚蠢的。 我得到了同樣的錯誤,但重新排列.h文件後,我做了這個。說:

1 classA.h include calssB.h;

2 classB.h聲明瞭兩個類,CLASSB和classC,(classB.h宣稱信號&插槽)

我做三件事,

  1. 單獨classC另一個.h文件中

  2. 消除關於類B的所有遠期類聲明

  3. classA.h包含在classA.cpp中,其他比通過classA.h

之後,QT編譯它。我會測試它是否工作。