C++ 编译可单击的QLabel时遇到问题

C++ 编译可单击的QLabel时遇到问题,c++,qt,C++,Qt,我想在Qt中有一个QLabel,它对鼠标点击事件做出反应。我发现了各种类似的解决方案,在我当前的5.8.x版本中似乎不起作用 这似乎是关于如何实现我的目标的共识: 如果我这样做,程序无法编译,错误如下: QtProjects/HelloWorldTest/qclickablelabel.cpp:5: error: undefined reference to `vtable for QClickableLabel' (我将ClickableLabel重命名为QClickableLabel,因为

我想在Qt中有一个
QLabel
,它对鼠标点击事件做出反应。我发现了各种类似的解决方案,在我当前的5.8.x版本中似乎不起作用

这似乎是关于如何实现我的目标的共识:

如果我这样做,程序无法编译,错误如下:

QtProjects/HelloWorldTest/qclickablelabel.cpp:5: error: undefined reference to `vtable for QClickableLabel'
(我将
ClickableLabel
重命名为
QClickableLabel
,因为这对我来说更有意义,剩下的是1:1)

我找到了这个错误消息,找到了只删除
Q_对象
宏的解决方案,这反过来又导致了这个对我来说毫无意义的错误:

#ifndef QCLICKABLELABEL_H
#define QCLICKABLELABEL_H

#include <Qt>
#include <QWidget>
#include <QLabel>

class QClickableLabel : public QLabel {
    //Q_OBJECT

public:
    explicit QClickableLabel(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
    ~QClickableLabel();

signals:
    void clicked();

protected:
    void mousePressEvent(QMouseEvent* event);

};

#endif // QCLICKABLELABEL_H
QClickableLabel::clicked
被定义为一个信号,而emit用于发出信号。那么为什么编译器找不到这个方法呢


现有的解决方案似乎已经过时,因此,如果能在当前版本中实现这一点,我们将不胜感激

取消注释Q_对象宏,moc编译器需要该类的宏


如果您正在使用QMake编译,请再次运行QMake,这样它将生成编译Qt代码所需的moc文件。

取消注释Q_对象宏,moc编译器需要该类所需的文件


如果使用QMake编译,请再次运行QMake,以便生成编译Qt代码所需的moc文件。

信号和插槽在Qt中使用:

MOC读取C++源文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生另一个C++ 包含这些类的元对象代码的源文件

您应该确保
moc
处理头文件,以便生成信号的实现:

  • Q_对象
    添加到类定义中
  • 将头文件添加到
    .pro
    文件中(假设您使用的是Qt Creator):
    HEADERS+=qclickablelabel.h

信号和插槽在Qt中使用:

MOC读取C++源文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生另一个C++ 包含这些类的元对象代码的源文件

您应该确保
moc
处理头文件,以便生成信号的实现:

  • Q_对象
    添加到类定义中
  • 将头文件添加到
    .pro
    文件中(假设您使用的是Qt Creator):
    HEADERS+=qclickablelabel.h

您是如何构建此功能的?您需要在
qclickablelabel.h
上运行
moc
,然后编译并链接它生成的代码(显然已取消
Q_对象的注释)。您是如何构建它的?您需要在
qclickablelabel.h
上运行
moc
,然后编译并链接它生成的代码(显然,取消了
Q_对象的注释)。
#include "qclickablelabel.h"
#include <QDebug>

QClickableLabel::QClickableLabel(QWidget* parent, Qt::WindowFlags f)
    : QLabel(parent) {

}

QClickableLabel::~QClickableLabel() {}

void QClickableLabel::mousePressEvent(QMouseEvent* event) {
    emit clicked(); // <----- Error happens here
}
QtProjects/HelloWorldTest/qclickablelabel.cpp:12: error: undefined reference to `QClickableLabel::clicked()'