2013-03-02 13 views
21

Ho un problema con la mia applicazione Qt. Sto cercando di emettere un segnale da un'altra classe (è una classe nidificata di quella in cui è posizionato il segnale).Come posso emettere un segnale da un'altra classe?

Ho già collegato il segnale con uno slot, che dovrebbe andare bene. Ma quando provo ad emettere questo segnale all'interno di questa classe annidata ottengo l'errore del compilatore:

cannot call member function without object

Cosa c'è di sbagliato? Ho cercato quello nella documentazione di Qt ma non ho potuto trovare la soluzione ragionevole o persino la spiegazione.

La definizione di classe semplificata è la seguente.

class LogWriter : public QDialog 
{ 
    Q_OBJECT 

public: 
    class Log : public QObject 
    { 
     Q_OBJECT 

    public: 
     bool print; 

     Log(bool _print, QString _color, QObject *obj = NULL) 
     : QObject(obj) 
     { 
     print = _print; 
     color = _color; 
     } 
    }; 

    LogWriter(QWidget * parent = 0); 
    ~LogWriter(); 

public slots: 
    void setMinVal(); 
    void setMediumVal(); 
    void setHighVal(); 
    void cleanWindow(); 
    void appendText(QString &text); 

signals: 
    void signalLogAppend(QString); 
}; 

I Collegare il segnale di un'istanza LOW del logwriter nel codice client in qualche fessura utilizzando la funzione la seguente chiamata:

connect(&LOW, SIGNAL(signalLogAppend(QString)), 
     this, SLOT(appendText(QString&)), 
     Qt::DirectConnection); 
+0

'LOW' è il tipo giusto di oggetto? – tmpearce

+0

Che cos'è BASSO? C'è del codice mancante per darti una corretta analisi. –

+0

LOW rappresenta la classe Log - la classe interna I menzionata nel post – lagoru

risposta

34

Per capire il problema si deve capire come i segnali vengono emessi :

Sono semplicemente una chiamata di funzione membro non statico e pertanto richiedono l'esecuzione di un'istanza (il "mittente"). In genere, questa istanza è this (se si emette il segnale da un'altra funzione membro non statica di della stessa classe), quindi la sintassi della chiamata diventa una normale chiamata di funzione senza alcuna istanza (letterale). La parola chiave emit è facoltativa ed è semplicemente una macro che non si espande. Le quattro versioni seguenti sono tutti uguali quando scritto in una funzione membro della stessa classe che contiene il segnale:

emit this->signalLogAppend("foo"); 
emit signalLogAppend("foo"); 
this->signalLogAppend("foo"); 
signalLogAppend("foo"); 

Se si emettono il segnale di classe esterna dall'interno della classe interna, il puntatore this riferisce a un'istanza della classe interna e quindi manca qualche istanza per la classe esterna. È lo stesso come se si chiamasse qualsiasi altra funzione della classe esterna all'interno della classe interna: il compilatore non sa su quale istanza dell'oggetto (della classe esterna) chiamarla. Quindi devi scrivere qualcosa di simile:

emit someLogWriter->signalLogAppend("foo"); 

Qui, someLogWriter è l'istanza di LogWriter per il quale si desidera emettere il segnale.

+0

Hm ... sembra che questa sia una spiegazione logica :) Ho anche provato a pensare in questo modo ma ho usato ptr-> emettere signalLogAppend() che dopo aver letto il tuo post sembra un po 'stupido - ok, grazie per l'aiuto !! ! – lagoru

+0

Beh, è ​​stupido, ma penso che dovrebbe funzionare anche. Poiché viene espanso in 'ptr-> signalLogAppend()' (nota lo spazio), che dovrebbe essere valido. – leemes

Problemi correlati