2017-05-30 49 views
0

我想在Qt中有一个QLabel这对鼠标点击事件有反应。我找到了各种类似的解决方案,似乎没有在我目前的版本5.8.x工作麻烦编译一个可点击的QLabel

这似乎是如何来完成我想要的共识:https://wiki.qt.io/Clickable_QLabel

如果我拿去,程序失败,出现错误编译:

QtProjects/HelloWorldTest/qclickablelabel.cpp:5: error: undefined reference to `vtable for QClickableLabel' 

(我改名ClickableLabelQClickableLabel因为它使我更有意义,剩下的就是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被定义为一个信号,并发射是提高的信号。那为什么编译器不能找到这个方法呢?

现有的解决方案似乎已经过时,所以要想达到目前版本的方法,我们将不胜感激!

+3

你是怎么建立这个的?您需要在'qclickablelabel.h'上运行'moc',然后编译并链接它生成的代码(显然,未注释'Q_OBJECT')。 –

回答

1

取消注释Q_OBJECT宏,moc编译器需要该类。

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

+0

是的,qmake运行做到了。谢谢 – radonthetyrant

1

信号和插槽都使用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