2017-05-30 3 views
0

Ich möchte eine QLabel in Qt haben, die auf das Mausklickereignis reagiert. Ich habe verschiedene ähnliche Lösungen gefunden, die offenbar nicht in meiner aktuellen Version 5.8.x arbeitenFehler beim Kompilieren einer anklickbaren QLabel

Diese den Konsens zu sein scheint, wie zu tun, was ich will: https://wiki.qt.io/Clickable_QLabel

Wenn ich nehmen, dass das Programm schlägt mit dem Fehler zu kompilieren:

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

(I ClickableLabel zu QClickableLabel umbenannt, weil es mehr Sinn für mich macht, der Rest ist 1: 1)

ich diese Fehlermeldung gejagt und gefunden die Lösung entfernen Sie einfach das Q_OBJECT Makro, was wiederum zu diesem Fehler führt, die den geringsten Sinn für mich macht:

#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 
} 

Fehlermeldung:

QtProjects/HelloWorldTest/qclickablelabel.cpp:12: error: undefined reference to `QClickableLabel::clicked()' 

Die QClickableLabel::clicked wird als ein Signal definiert und emittieren ist, Signale für das Anheben. Warum findet der Compiler die Methode nicht?

Die vorhandenen Lösungen scheinen veraltet zu sein, daher wäre eine Möglichkeit, dies für die aktuelle Version zu erreichen, sehr zu begrüßen!

+3

Wie bauen Sie das? Sie müssen 'moc' auf' qclickable- label.h' ausführen und dann mit dem erzeugten Code kompilieren und verlinken (wobei das 'Q_OBJECT' offensichtlich unkommentiert ist). –

Antwort

1

Uncoment das Makro Q_OBJECT, der Moc-Compiler benötigt das für die Klasse.

Wenn Sie mit QMake compilieren, führen Sie qmake erneut aus, damit die zum Kompilieren des Qt-Codes erforderlichen MOC-Dateien generiert werden.

+0

ja, der qmake Lauf hat es getan. Vielen Dank – radonthetyrant

1

Signal und Slots in Qt unter Verwendung der implementierten 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.

Sie sollten sicher sein, dass moc Ihre Header-Datei verarbeitet, um die Umsetzung Ihrer Signale zu erzeugen:

  • hinzufügen Q_OBJECT zu Ihrer Klassendefinition
  • Fügen Sie die Header-Datei zu Ihrer .pro Datei hinzu (vorausgesetzt, Sie verwenden Qt Creator): HEADERS += qclickablelabel.h
Verwandte Themen