我想在Qt中有一个mount_uploaders
,它对鼠标点击事件做出反应。我找到了各种类似的解决方案,这些解决方案在我当前的版本5.8.x
这似乎是如何实现我想要的共识:https://wiki.qt.io/Clickable_QLabel
如果我这样做,程序无法编译错误:
QLabel
(我将QtProjects/HelloWorldTest/qclickablelabel.cpp:5: error: undefined reference to `vtable for QClickableLabel'
重命名为ClickableLabel
,因为它对我更有意义,其余的是1:1)
我搜索了这条错误消息,发现解决方案只是移除QClickableLabel
宏,这反过来导致了这个错误,这对我来说最不合理:
Q_OBJECT
#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
错误讯息:
#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()'
被定义为信号,而发射用于提升信号。那么编译器为什么不找到方法?
现有的解决方案似乎已经过时,因此我们非常感谢为当前版本实现这一目标的方法!
答案 0 :(得分:1)
解开Q_OBJECT宏,moc编译器需要该类。
如果您正在使用QMake进行编译,请再次运行qmake,以便生成编译Qt代码所需的moc文件。
答案 1 :(得分:1)
使用moc
compiler:
moc读取C ++源文件。如果找到一个或多个类 包含Q_OBJECT宏的声明,它会生成另一个C ++ 源文件,包含这些类的元对象代码。
您应该确保moc
处理您的头文件以生成信号的实现:
Q_OBJECT
添加到您的班级定义.pro
文件中(假设您使用的是Qt Creator):HEADERS += qclickablelabel.h