2010-04-09 56 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编译它。我会测试它是否工作。