我试图在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退出状态'错误。
我错过了什么?
答案 0 :(得分:12)
将Q_OBJECT宏放在顶部,(必须是类中的第一件事而没有“;”)
确保您进行完全重建,VS-add-in尤其不会始终注意到文件在没有重建的情况下变为qt感知。
答案 1 :(得分:0)
最终是宏。我不得不重新启动我的电脑才能工作,清理和重建项目并没有成功。在重新启动之前,Qt Creator一直给出'ld返回1退出状态'错误和vtable警告。真的很奇怪。 - David McDavidson
这并不奇怪,这是愚蠢的。 我得到了同样的错误,但是在重新排列.h文件之后我做了它。说:
1 classA.h包括calssB.h;
2 classB.h声明了两个类,classB和classC,(classB.h声明信号和插槽)
我做了三件事,
将classC分离到另一个.h文件
消除关于classB的所有前瞻性类声明
classA.h包含的classB.h,而不是classA.h