2015-01-03 21 views
6

Come posso passare il segnale o lo slot (funzione membro, nuova sintassi in Qt 5) come parametro per funzionare e quindi chiamare connect?Come dichiarare la sintassi New-Signal-Slot in Qt 5 come parametro per il funzionamento

ad es. Voglio scrivere una funzione che aspetta un segnale.

Nota: Non è compilato - PointerToMemberFunction è la mia domanda.

bool waitForSignal(const QObject* sender, PointerToMemberFunction??? signal, int timeOut = 5000/*ms*/) 
{ 
    if (sender == nullptr) 
    return true; 
    bool isTimeOut = false; 
    QEventLoop loop; 
    QTimer timer; 
    timer.setSingleShot(true); 
    QObject::connect(&timer, &QTimer::timeout, 
    [&loop, &isTimeOut]() 
    { 
     loop.quit(); 
     isTimeOut = true; 
    }); 
    timer.start(timeOut); 
    QObject::connect(sender, signal, &loop, &QEventLoop::quit); 
    loop.exec(); 
    timer.stop(); 
    return !isTimeOut; 
} 

C'è un modo per passare la lista dei segnali a questa funzione per la connessione?

+3

Purtroppo non c'è API pubblica per questo. Certo, puoi semplicemente dare un'occhiata al codice e vedere il trucco (per esempio vedi [qui] (https://qt.gitorious.org/qt/qtbase/source/350c60b79e720d005a1a554fd177dbda607079cf:src/corelib/kernel/qtimer.h#L84) per QTimer), ma sfortunatamente sono API private (= uso a proprio rischio, possiamo interromperle in qualsiasi momento, ecc.) – peppe

risposta

6

Si dovrebbe creare template:

template<typename Func> 
void waitForSignal(const typename QtPrivate::FunctionPointer<Func>::Object *sender, Func signal) { 
    QEventLoop loop; 
    connect(sender, signal, &loop, &QEventLoop::quit); 
    loop.exec(); 
} 

Usage:

waitForSignal(button, &QPushButton::clicked); 
+2

Funziona, ma vedi il mio commento sopra. Questa è un'API privata. – peppe

0

Si può semplicemente utilizzare QSignalSpy attendere un segnale emesso da:

QSignalSpy spy(sender, SIGNAL(someSignal())); 
spy.wait(timeOut); 

Or (Questo è possibile in Qt 5.4):

QSignalSpy spy(sender, &SomeObject::someSignal); 
spy.wait(timeOut); 

Se si desidera implementare in una funzione:

Non dimenticare di aggiungere il modulo rilevante in qmake:

QT += testlib 
+1

Non si deve usare 'QSignalSpy' (o in generale' QtTest') nel codice dell'applicazione. – peppe

+0

@peppe Non c'è niente di sbagliato nell'usarlo mentre funziona e non c'è altro modo che sia più semplice. – Nejat