2010-04-09 3 views
8

Sto provando a generare un segnale quando si verifica un doppio clic in uno dei widget trascinabili sullo fridge magnets example. Ecco i cambiamenti che ho fatto alla fonte esempio:Qt - nessun errore di segnale

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 

}; 

L'unica cosa che ho cambiato nel file di implementazione è l'aggiunta connect(this,SIGNAL(testSignal()),this,SLOT(testSlot())); al costruttore di DragLabel.

Cercando di compilare il progetto ha portato in 'undefined reference to `DragLabel :: segnale di test()' e 'collect2: ld returned 1 exit status di' errori.

Quando io commento la chiamata al segnale, compilato ed eseguito, ma emana 'Oggetto :: Connect: Nessun segnale tale QLabel :: segnale di test() in draglabel.cpp' avvertimento nell'output dell'applicazione. Apparentemente testSignal() non viene riconosciuto come segnale.

ho cercato di aggiungere la macro Q_OBJECT per DragLabel ma il risultato e 4 'undefined reference to `vtable per DragLabel' 'avvertimenti e un'collect2: ld returned 1 exit status 'errore.

Cosa mi manca?

+0

Nel codice di esempio manca la chiamata macro Q_OBJECT, che potrebbe essere la causa dei problemi. –

+0

Oh sì, ho dimenticato di dirlo, ho provato ad aggiungere Q_OBJECT prima. Lo aggiungerò alla domanda. –

risposta

12

Mettere la macro Q_OBJECT in alto, (deve essere la prima cosa di classe e non ";")

Assicurati di una ricostruzione completa, il VS-aggiuntivo soprattutto non sempre accorge che un file è diventato qt-aware senza una ricostruzione.

Più buon consiglio 20 ways to debug Qt signals and slots

+0

Alla fine era la macro. Ho dovuto riavviare il mio PC per farlo funzionare, pulire e ricostruire il progetto non ha funzionato. Prima di riavviare Qt Creator continuava a dare l'errore "ld restituito 1 stato di uscita" e gli avvisi vtable. Molto strano. –

+0

Grazie Martin. Il tuo collegamento mi ha salvato la vita. Nel mio caso per lo stesso errore, si trattava di una mancata corrispondenza dei parametri nelle funzioni di segnale e di slot. –

+1

@Anisha Kaul - i segnali/gli slot sono in fase di esecuzione, quindi il compilatore non rileva errori. Ne avevo uno oggi dove avevo il caso di una singola lettera sbagliata nel mezzo di un nome di segnale! –

0

E 'stata la macro alla fine. Ho dovuto riavviare il mio PC per farlo funzionare, pulire e ricostruire il progetto non ha funzionato. Prima di riavviare Qt Creator continuava a dare l'errore "ld restituito 1 stato di uscita" e gli avvisi vtable. Molto strano. - David McDavidson

Non è strano, è stupido. Ho ricevuto lo stesso errore, ma lo faccio dopo aver riorganizzato i file .h. Di ':

1 classeA.h include calssB.h;

2 classB.h dichiarato due classi, ClassB e ClassC, (classB.h segnali dichiarato & fessura)

faccio tre cose,

  1. ClassC separato per un altro file .h

  2. eliminare tutte le dichiarazioni di classe avanti sulla classeB

  3. classB.h incluso dalla classeA.cpp, altro che per classeA.h

successivamente, QT lo ha compilato. Verificherò se funziona.