Qt - 没有这样的信号错误

时间:2010-04-09 19:08:17

标签: qt signals-slots

我试图在fridge magnets example的其中一个可拖动小部件中发生双击时触发信号。这是我对示例源所做的更改:

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

};

我在实现文件中唯一改变的是向DragLabel的构造函数添加connect(this,SIGNAL(testSignal()),this,SLOT(testSlot()));

尝试编译项目导致'未定义引用`DragLabel :: testSignal()'和' collect2:ld返回1退出状态'错误。

当我注释掉对信号的调用时,它会编译并运行,但是放弃' Object :: connect:在draglabel.cpp中没有这样的信号QLabel :: testSignal()'警告应用程序输出。显然,testSignal()不会被识别为信号。

我尝试将Q_OBJECT宏添加到DragLabel但是它导致4'未定义引用`vtable for DragLabel''警告和' collect2:ld返回1退出状态'错误。

我错过了什么?

2 个答案:

答案 0 :(得分:12)

将Q_OBJECT宏放在顶部,(必须是类中的第一件事而没有“;”)

确保您进行完全重建,VS-add-in尤其不会始终注意到文件在没有重建的情况下变为qt感知。

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

答案 1 :(得分:0)

  

最终是宏。我不得不重新启动我的电脑才能工作,清理和重建项目并没有成功。在重新启动之前,Qt Creator一直给出'ld返回1退出状态'错误和vtable警告。真的很奇怪。 - David McDavidson

这并不奇怪,这是愚蠢的。 我得到了同样的错误,但是在重新排列.h文件之后我做了它。说:

1 classA.h包括calssB.h;

2 classB.h声明了两个类,classB和classC,(classB.h声明信号和插槽)

我做了三件事,

  1. 将classC分离到另一个.h文件

  2. 消除关于classB的所有前瞻性类声明

  3. classA.h包含的classB.h,而不是classA.h

  4. 之后,QT编译了它。我会测试它是否正常工作。