2017-05-30 71 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