麻烦编译一个可点击的QLabel
我想在Qt中有一个QLabel
这对鼠标点击事件有反应。我找到了各种类似的解决方案,似乎没有在我目前的版本5.8.x工作麻烦编译一个可点击的QLabel
这似乎是如何来完成我想要的共识: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
被定义为一个信号,并发射是提高的信号。那为什么编译器不能找到这个方法呢?
现有的解决方案似乎已经过时,所以要想达到目前版本的方法,我们将不胜感激!
取消注释Q_OBJECT宏,moc编译器需要该类。
如果您使用QMake进行编译,请再次运行qmake,以便生成编译Qt代码所需的moc文件。
是的,qmake运行做到了。谢谢 – radonthetyrant
信号和插槽都使用Qt的实施moc
compiler:
The moc reads C++ source files. If it finds one or more class declarations that contain the Q_OBJECT macro, it produces another C++ source file which contains the meta object code for those classes.
你应该确保moc
处理你的头文件,以生成您的信号执行:
- 添加
Q_OBJECT
到您的班级定义 - 将头文件添加到您的
.pro
文件(假设您使用的是Qt Creator):HEADERS += qclickablelabel.h
你是怎么建立这个的?您需要在'qclickablelabel.h'上运行'moc',然后编译并链接它生成的代码(显然,未注释'Q_OBJECT')。 –