2017-05-30 27 views
0

マウスクリックイベントに反応するQtにQLabelを入れたいと思います。 、プログラムを私はそれを取る場合はhttps://wiki.qt.io/Clickable_QLabelクリック可能なQLabelをコンパイルする際の問題

:私はこれは私が欲しいものを達成する方法についてのコンセンサスのようだ私の現在のバージョン5.8.x

で作業していないよう様々な同様のソリューションを発見しましたエラーでコンパイルに失敗します。

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

(それは私に多くの意味がありますので、私はQClickableLabelClickableLabelと改名、残りは1:1)

が、私はこのエラーメッセージを追い詰め、見つかりました

#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 

:ちょうど今度は私にとって最も理にかなって、このエラーにつながる、Q_OBJECTマクロを削除するためのソリューション。

#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
関連する問題