我想在 Qt 中有一个 QLabel
来响应鼠标点击事件。我发现了各种类似的解决方案,但在我当前的 5.8.x 版本中似乎不起作用
这似乎是关于如何完成我想要的事情的共识:https://wiki.qt.io/Clickable_QLabel
如果我这样做,程序将无法编译并出现错误:
QtProjects/HelloWorldTest/qclickablelabel.cpp:5: error: undefined reference to `vtable for QClickableLabel'
(我将ClickableLabel
重命名为QClickableLabel
因为对我来说更有意义,剩下的是1:1)
我找到了这个错误消息并找到了删除 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()'
QClickableLabel::clicked
被定义为一个信号,emit 用于发出信号。那么为什么编译器找不到方法呢?
现有的解决方案似乎已经过时,因此我们将不胜感激为当前版本实现这一目标的方法!
最佳答案
取消注释 Q_OBJECT 宏,moc 编译器需要它用于该类。
如果您正在使用 QMake 进行编译,请再次运行 qmake,这样它将生成编译 Qt 代码所需的 moc 文件。
关于c++ - 编译可点击的 QLabel 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44262750/