2013-10-04 11 views
7

Di recente ho avuto bisogno di aggiungere un segnale a una classe, quindi ho cambiato la classe in eredita da QObject e aggiunto la macro Q_OBJECT nella definizione della classe. Dal momento che così facendo ho "errore di riferimento del segnale non definito per 'vtable per CLICommand'" errore sulla linea di classe inferiore:Qt "errore di riferimento non definito del segnale" dopo aver ereditato da 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; 

e l ' "errore segnale di riferimento definito per 'vtable per CLICommand'" secondo errore sulla linea in basso (INIZIALIZZA la variabile membro):

// 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) 
{ 
} 

e proprio qui è dove emettono il segnale. La linea Emit genera l'errore undefined reference to `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(); 
} 

Ho letto un sacco di messaggi su questo argomento, ma nessuno sembra applicarsi. Ho persino provato a pulire/ricostruire. Non sto usando boost o altre librerie ... solo QT 5

Qualcuno può dirmi cosa sto facendo male?


SOLUZIONE: in Qt Creator, cliccare a destra il progetto, selezionare RUN qmake, quindi rigenerare tutti. Altri post sull'esecuzione di REBUILD ALL non sono corretti ... in proprio non eseguiranno qmake.

risposta

12

È necessario assicurarsi che 'moc' sia (ri) eseguito per tali modifiche. Sembra che manchi il file moc generato o che sia obsoleto e quindi non contenga il riferimento corretto allo stato corrente.

QtCreator non esegue nuovamente qmake correttamente quando viene aggiunta la macro Q_OBJECT. Questo è stato un problema di vecchia data, quindi dovrai eseguirlo di nuovo manualmente.

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

+0

sempre con una risposta buona e semplice, grazie +1 –

+0

Forse il modo più semplice per eseguire nuovamente esplicitamente 'qmake' quando si usa Qt Creator è quello di andare alla costruzione direttamente e rimuovere' Makefile'. Quindi, nella prossima azione 'Costruisci tutto', Qt Creator lo rigenera, in modo tale che l'errore di collegamento relativo al cambio di 'Q_OBJECT' scompaia. – maxschlepzig

Problemi correlati