2012-03-29 12 views

risposta

8

Non è possibile in Qt versioni < Qt 5.

Per poter utilizzare i segnali/slot il compilatore oggetto meta deve essere invocati. Per rendere questo accada la classe deve soddisfare i seguenti requisiti:

  • Eredita da QObject o di qualsiasi altra sottoclasse (ad esempio QWidget, QPushButton ecc)
  • Il Q_OBJECT macro dovrebbe essere definito nella sezione privata della classe al fine per attivare funzioni metaoggetto come slot
  • Utilizza gli Qt parole slots e signals per dichiarare quali funzioni dovrebbe essere maniglie nel meta compilatore come fessure o segnali

Per ulteriori dettagli controllare le pagine della documentazione corrispondenti sulla e signals & slots

controllare anche la documentazione QObject:

noti che la macro Q_OBJECT è obbligatoria per qualsiasi oggetto che implementa segnali, fessure o proprietà. È inoltre necessario eseguire il compilatore di oggetti Meta nel file di origine. Si consiglia vivamente di utilizzare di questa macro in tutte le sottoclassi di QObject indipendentemente dal fatto che o non utilizzino effettivamente segnali, slot e proprietà, dal momento che l'errore su può portare alcune funzioni a mostrare comportamenti strani.

Modifica: A partire da Qt 5, i funtori e le espressioni lambda possono essere utilizzati come slot. Vedi New Signal Slot Syntax in Qt 5

+1

È importante notare che, sebbene ciò non sia possibile in Qt 4, sta andando per essere possibile in Qt 5, utilizzando il nuovo meccanismo segnale/slot. http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir

+0

Hai ragione, ma IMHO dovrebbe essere usato solo in rari casi. L'utilizzo degli slot è più elegante rispetto all'utilizzo di tr1 :: bind con funzioni semplici. – pnezis

+0

sono assolutamente d'accordo, dovrebbero essere un caso raro. Un po 'come le dichiarazioni brevi di cirquit, sono utili in un insieme molto ristretto di circostanze e in questi casi aumentano la leggibilità e la facilità di manutenzione. Ma, dovrebbero essere usati solo allora, non come regola generale. – leinir

0

Improbabile. Il compiler Qt-meta-object (moc) include la funzione, sono contrassegnati come slot -s, in code-wrapper relativamente grande. I file, creati da moc, iniziano con moc_, guardali.

8

A partire da Qt 5, i funtori e le espressioni lambda possono essere utilizzati come slot (come precedentemente menzionato, qui: http://qt-project.org/wiki/New_Signal_Slot_Syntax).

Come io non riuscivo a trovare codice di esempio, ho aggiunto il seguente:

Questo esempio utilizza boost::function per un membro della classe ClassName::classMember() senza parametri.

boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance); 
    connect(QObjectInstance, &QObject::signalName, f); 

Quando il segnale e la classe membro Qt dispone di parametri (ad esempio ClassName::classMember(int)), la funzione boost deve essere adattato nel modo seguente:

boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1); 

Maggiori informazioni sul boost :: bind può essere trovato nel documentazione: http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html