C++ 编译可单击的QLabel时遇到问题
我想在Qt中有一个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,因为
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_对象
- 将头文件添加到
文件中(假设您使用的是Qt Creator):.pro
HEADERS+=qclickablelabel.h
MOC读取C++源文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生另一个C++ 包含这些类的元对象代码的源文件
您应该确保moc
处理头文件,以便生成信号的实现:
- 将
添加到类定义中Q_对象
- 将头文件添加到
文件中(假设您使用的是Qt Creator):.pro
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()'