2015-01-03 7 views
6

関数のパラメータとしてsignalまたはslot(メンバ関数、Qt 5の新しい構文)を渡してからconnectを呼び出すにはどうすればよいですか?関数へのパラメータとしてQt 5の新信号スロット構文を宣言する方法

私は、信号を待つ関数を書いてみたいです。

注::コンパイルされていません - PointerToMemberFunctionは私の質問です。

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; 
} 

信号のリストをこの関数に渡して接続する方法はありますか?

+3

残念ながら、このためのパブリックAPIはありません。確かに、あなたは単にコードを覗いてみてください(例えば、[here](https://qt.gitorious.org/qt/qtbase/source/350c60b79e720d005a1a554fd177dbda607079cf:src/corelib/kernel/qtimer.h#L84参照)。 )QTimerのため)、残念ながらそれはプライベートAPI(=あなたの責任で使用する、私たちはいつでも破ることができるなど) – peppe

答えて

6

あなたがテンプレートを作成する必要があります

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

は使用方法:

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

か(この:あなたは単にによって放出される信号を待つQSignalSpyを使用することができます

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

作品は、上記の私のコメントを参照してください。これはプライベートAPIです。 – peppe

0

をQt 5.4で可能です):

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

あなたが機能でそれを実装する場合:

はqmakeの中で、関連するモジュールを追加することを忘れないでください:

QT += testlib 
+1

アプリケーションコードで 'QSignalSpy'(あるいは一般的には' QtTest')を使うべきではありません。 – peppe

+0

@peppe動作し、より簡単な方法はありません。 – Nejat

関連する問題