2013-10-04 9 views
7

Niedawno musiałem dodać sygnał do klasy, więc zmieniłem klasę na dziedziczkę z QObject i dodałem makro Q_OBJECT do definicji klasy. Ponieważ ten sposób uzyskać „sygnału niezdefiniowany błąd odniesienia dla«vtable dla CLICommand»” błędu na linii klasy poniżej:Qt "błąd niezdefiniowanego sygnału odniesienia" po odziedziczeniu z QObject

// File clicommand.h 
#include <QString> 
#include <QStringList> 
#include <QTcpSocket> 
#include "telnetthread.h" 
class CLICommand : public QObject 
{ 
Q_OBJECT 
public: 
    CLICommand(TelnetThread *parentTelnetThread); 
signals: 
    void signal_shutdown_request(); 
private: 
    TelnetThread *m_parentTelnetThread; 

i „sygnału nieokreślonym błędem odniesienia dla«vtable dla CLICommand»” Drugi błąd w wierszu poniżej (intializing zmienną member):

// File clicommand.cpp 
#include <QDebug> 
#include <QTcpSocket> 
#include <QTextStream> 
#include "version.h" 
#include "clicommand.h" 
#include "telnetthread.h" 
#include "logger.h" 
CLICommand::CLICommand(TelnetThread *parentTelnetThread) 
    : m_parentTelnetThread(parentTelnetThread) 
{ 
} 

i właśnie tutaj jest miejsce, gdzie emituje sygnał. Linia emitować generuje błąd niezdefiniowanej odniesienie do `CLICommand :: signal_shutdown_request()”:

// file shutdown_clicommand.cpp 
#include <QIODevice> 
#include "clicommand.h" 
#include "logger.h" 
#include "version.h" 
void CLICommand::execute_shutdown(const QStringList &commandLineFragments) 
{ 
    emit signal_shutdown_request(); 
} 

czytałem kilka postów na ten temat, ale nikt wydaje się mieć zastosowanie. Próbowałem nawet czyszczenia/przebudowy. Nie używam boost lub innych bibliotek ... tylko QT 5

Czy ktoś może mi powiedzieć, co robię źle?


ROZWIĄZANIE: w Qt Creator, kliknij prawym przyciskiem myszy projekt, wybierz Uruchom QMake, a następnie odbudować wszystko. Inne posty na temat uruchamiania REBUILD ALL są niepoprawne ... na własną rękę, które NIE uruchomią qmake.

Odpowiedz

12

Musisz upewnić się, że "moc" jest (ponownie) uruchomiony dla tych zmian. Wygląda na to, że brakuje Ci wygenerowanego pliku moc, lub jest on nieaktualny i dlatego nie zawiera właściwego odniesienia do bieżącego stanu.

QtCreator nie ponownie uruchamia się qmake poprawnie po dodaniu makra Q_OBJECT. Problem ten już dawno temu wystąpił, dlatego trzeba go ponownie uruchomić ręcznie.

https://bugreports.qt.io/browse/QTCREATORBUG-231

+0

zawsze z dobrą i prostą odpowiedź, dzięki +1 –

+0

Być może najprostszym sposobem, aby ponownie uruchomić 'qmake' jawnie przy użyciu Qt Creator jest, aby przejść do kompilacji bezpośrednio i usunąć' Makefile'. Następnie, przy następnej akcji "Zbuduj wszystko", Qt Creator zregeneruje ją tak, że błąd związany z zmianą powiązania 'Q_OBJECT' zniknie. – maxschlepzig

Powiązane problemy