2014-03-04 57 views
4

当前我正在创建一个线程。
如果该线程想要与主线程通信以便与GUI进行交互,它会发出连接到主窗口小部件线程上的插槽的信号。这一切都很好。
但是,对于这个解决方案,我必须回到我原来的GUI形式并添加插槽。在QWidgets线程的实例上运行一个lambda函数槽

我想知道我是否可以简单地使用lambda函数来做到这一点。 例如,在以下示例中,类foo是在单独的线程上启动的。像这样

QObject::connect(this,&myclass::someSignal, 
       [](std::string msg) 
       { 
        QMessageBox::information(mptr,"Some title", 
        msg.c_str(),QMessageBox::StandardButton::Ok); 
       }); 

这给出了必须在GUI线程中创建Widget的错误。我明白这一点。

我想知道是否有方法让我指定在mptr实例上运行此插槽。像我们这样使用老的Qt QObject::connect信号插槽参数

+0

什么是'mptr'?它是您使用此代码的类的成员变量吗? – Praetorian

+0

mptr是一个'QMainWindow'的地址,它应该显示消息框 – Rajeshwar

+0

我想这里是“缺少的功能/建议”你在找什么,不是吗? https://bugreports.qt-project.org/browse/QTBUG-32339 – fasked

回答

0

就像在您指定的发送者和接收者的经典信号/槽连接,你可以指定一个QObject上下文连接到拉姆达:

QObject::connect(this, &myclass::someSignal, 
       mptr, // Slot/lambda will be executed in this QObject's context 
       [](std::string msg) 
       { 
        QMessageBox::information(mptr,"Some title", 
        msg.c_str(),QMessageBox::StandardButton::Ok); 
       }); 

意味着时隙/λ将在上下文的事件循环排队指定:
https://doc.qt.io/qt-5/qobject.html#connect-5

相关问题