【问题标题】:Qt - no such signal errorQt - 没有这样的信号错误
【发布时间】:2010-04-09 19:08:16
【问题描述】:

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

拖动标签:

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 的构造函数中。

尝试编译项目导致“undefined reference to `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 返回 1 个退出状态” '错误。

我错过了什么?

【问题讨论】:

  • 您的示例代码缺少 Q_OBJECT 宏调用,这可能是您的问题的原因。
  • 哦,是的,我忘了提,我之前确实尝试过添加 Q_OBJECT。我将把它添加到问题中。

标签: qt signals-slots


【解决方案1】:

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

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

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

【讨论】:

  • 最后是宏。我不得不重新启动我的电脑才能让它工作,但清理和重建项目并没有成功。在重新启动 Qt Creator 之前,不断给出“ld 返回 1 退出状态”错误和 vtable 警告。真的很奇怪。
  • 谢谢马丁。你的链接救了我的命。在我的情况下,同样的错误是信号和槽函数中的参数不匹配。
  • @Anisha Kaul - 信号/插槽是运行时,因此编译器不会注意到错误。我今天遇到了一个信号名称中间有一个字母错误的情况!
  • @MartinBeckett 编译器甚至没有捕获语法错误!这太可怕了。 :(
  • @Anisha - 它非常有用,因为您可以向可能未加载的运行时组件发送信号。因此,您可以将信号广播到不存在的插槽 - 但很难捕获。虽然你可以编写一个宏来在运行时捕获它
【解决方案2】:

最后是宏。我不得不重新启动我的电脑才能让它工作,但清理和重建项目并没有成功。在重新启动 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 编译它。我会测试它是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多