c++ - 编译可点击的 QLabel 时遇到问题

标签 c++ qt

我想在 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/

相关文章:

c++ - 更新标签文本 GTK+ C++

c++ - 无法从不同的线程播放 QMediaPlayer

c++ - 有没有什么方法可以在 Windows 上最大化我的应用程序的时间片?

c++ - header 背后的基本原理是什么?

c++ - 使用QT读取socket

c++ - Qt 5.4/Qml : Prevent binding loop

c++ - 如何从可变构造函数参数构造任何对象?

c++ - 使用 QPainterPath 创建一个凹矩形

c++ - QSerialPort 5.2 中的 SerialPortError?

c++ - GTK 应用程序 : How do I create a working indicator with Qt/C++?