无法编译可点击的QLabel

时间:2017-05-30 12:48:41

标签: c++ qt

我想在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()' 被定义为信号,而发射用于提升信号。那么编译器为什么不找到方法?

现有的解决方案似乎已经过时,因此我们非常感谢为当前版本实现这一目标的方法!

2 个答案:

答案 0 :(得分:1)

解开Q_OBJECT宏,moc编译器需要该类。

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

答案 1 :(得分:1)

使用moc compiler

在Qt中实现信号和插槽
  

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

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

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