8

我试图在冰箱磁铁示例上的一个可拖动小部件中发生双击时触发信号。这是我对示例源所做的更改:

拖动标签:

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 returned 1 exit status ”错误。

当我注释掉对信号的调用时,它会编译并运行,但会在应用程序输出中发出“ Object::connect: No such signal QLabel::testSignal() in draglabel.cpp ”警告。显然 testSignal() 没有被识别为信号。

我尝试将 Q_OBJECT 宏添加到 DragLabel 但它导致 4 ' undefined reference to `vtable for DragLabel' ' 警告和 ' collect2: ld returned 1 exit status ' 错误。

我错过了什么?

4

2 回答 2

13

将 Q_OBJECT 宏放在顶部,(必须是类中的第一件事,并且没有 ";" )

确保您进行了完全重建,特别是 VS-add-in 并不总是注意到文件在没有重建的情况下已成为 qt-aware。

更多好建议20 种调试 Qt 信号和插槽的方法

于 2010-04-09T19:32:02.223 回答
0

最后是宏。我不得不重新启动我的电脑才能让它工作,但清理和重建项目并没有成功。在重新启动 Qt Creator 之前,不断给出“ld 返回 1 退出状态”错误和 vtable 警告。真的很奇怪。——大卫·麦克戴维森

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

1 classA.h 包括 calssB.h ;

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

我做三件事,

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

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

  3. classB.h 包含在 classA.cpp 中,除了 classA.h

之后,QT 编译它。我会测试它是否有效。

于 2011-12-23T20:01:33.043 回答