How to declare New-Signal-Slot syntax in Qt 5 as a parameter to function

匿名 (未验证) 提交于 2019-12-03 01:18:02

问题:

How can I pass signal or slot (member-function, new syntax in Qt 5) as a parameter to function and then call connect?

e.g. I want to write a function that waits for a signal.

Note: It is not compile - PointerToMemberFunction is my question.

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

Is there any way to pass list of signals to this function for connection?

回答1:

You should create template:

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

Usage:

waitForSignal(button, &QPushButton::clicked); 


回答2:

You can simply use QSignalSpy to wait for a signal to be emitted by :

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

Or (This is possible in Qt 5.4) :

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

If you want to implement it in a function :

bool waitForSignal(const typename QtPrivate::FunctionPointer::Object *sender, Func signal, int timeOut = 5000/*ms*/) {    QSignalSpy spy(sender, signal);    return spy.wait(timeOut); } 

Do not forget to add the relevant module in qmake :

QT += testlib 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!