2010-04-09 13 views
8

Ich versuche ein Signal auszulösen, wenn in einem der ziehbaren Widgets auf dem fridge magnets example ein Doppelklick passiert. Hier sind die Änderungen, die ich auf das Beispiel Quelle gemacht:Qt - kein solcher Signalfehler

DragLabel:

class DragLabel : public QLabel 
{ 
public: 
    DragLabel(const QString &text, QWidget *parent); 
    QString labelText() const; 

public slots: 
    void testSlot(){qDebug()<<"testSlot";} //<-- implemented this slot 

protected: 
    void mouseDoubleClickEvent(QMouseEvent *ev){emit testSignal();} //<-- overriden this method 

private: 
    QString m_labelText; 

signals: 
    void testSignal(); //<-- added this signal 

}; 

Das einzige, was ich in der Implementierungsdatei geändert wird, das Hinzufügen connect(this,SIGNAL(testSignal()),this,SLOT(testSlot())); zu DragLabel Konstruktor.

Der Versuch, das Projekt zu kompilieren führte zu 'undefined reference to `DragLabel :: Testsignal()' und 'collect2: ld returned 1 Exit-Status' Fehler.

Als ich den Anruf auf das Signal auf Kommentar, es kompiliert und ausgeführt, sondern verströmt ‚Object :: connect: Kein solches Signal QLabel :: Testsignal() in draglabel.cpp‘ in der Ausgabe Anwendung warnen. Anscheinend wird testSignal() nicht als Signal erkannt.

Ich habe versucht, das Q_OBJECT Makro DragLabel hinzuzufügen, aber es ergibt 4 'undefined reference to `VTable für DragLabel' 'Warnungen und einer' collect2: ld returned 1 exit status" Fehler.

Was fehlt mir?

+0

In Ihrem Beispielcode fehlt der Makroaufruf Q_OBJECT, der die Ursache Ihrer Probleme sein könnte. –

+0

Oh yeah Ich habe vergessen zu erwähnen, dass ich vorher Q_OBJECT hinzugefügt habe. Ich füge das zur Frage hinzu. –

Antwort

12

Setzen Sie den Q_OBJECT Makro an der Spitze, (muss als erstes in der Klasse sein und kein „;“)

unten finden Sie eine vollständige Wiederherstellung, wird der VS-Add-in vor allem nicht immer bemerken dass eine Datei ohne Neuaufbau qt-aware geworden ist.

Weitere gute Ratschläge 20 ways to debug Qt signals and slots

+0

Es war das Makro am Ende. Ich musste meinen PC neu starten, damit es funktionierte, Reinigung und Wiederaufbau des Projekts funktionierten nicht. Vor dem Neustart gab Qt Creator weiterhin den Fehler 'ld returned 1 exit status' und die vtable-Warnungen aus. Sehr seltsam. –

+0

Danke Martin. Deine Verbindung hat mein Leben gerettet. In meinem Fall war es für den gleichen Fehler ein Parameter, der bei Signal- und Schlitzfunktionen nicht übereinstimmte. –

+1

@Anisha Kaul - Signal/Slots sind Laufzeit, so dass der Compiler keine Fehler bemerkt. Ich hatte heute einen, bei dem ich den Fall eines einzelnen Buchstabens falsch in der Mitte eines Signalnamens hatte! –

0

Es war das Makro am Ende. Ich musste meinen PC neu starten, damit es funktionierte, Reinigung und Wiederaufbau des Projekts funktionierten nicht. Vor dem Neustart gab Qt Creator weiterhin den Fehler 'ld returned 1 exit status' und die vtable-Warnungen aus. Sehr seltsam. - David McDavidson

Es ist nicht komisch, es ist dumm. Ich habe den gleichen Fehler, aber ich mache es nach dem Neuordnen der .h-Dateien. Sprich:

1 KlasseA.h enthalten calssB.h;

2 classB.h deklariert zwei Klasse, classB und Klasse C (classB.h Signale & Schlitz deklariert)

ich drei Dinge tun,

  1. separate Klasse C auf ein anderes .h-Datei

  2. Eliminieren Sie alle Vorwärtsklasse Deklaration über KlasseB

  3. classB.h enthalten von classA.cpp, andere als von KlasseA.h

danach QT kompiliert es. Ich werde testen, ob es funktioniert.

Verwandte Themen