在 QWidgets 线程的实例上运行 lambda 函数槽

Running a lambda function slot on instance of a QWidgets Thread

本文关键字:运行 lambda 函数 实例 QWidgets 线程      更新时间:2023-10-16

目前我正在创建一个线程。
如果该线程想要与主线程通信以便与 GUI 交互,它会发出连接到主小部件线程上的插槽的信号。这都可以正常工作。
但是,对于此解决方案,我必须返回到原始的GUI表单并向其添加插槽。

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

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

这给出了一个错误,即必须在 GUI 线程中创建小部件。我明白这一点。

我想知道是否有办法指定mptr实例上运行此插槽。就像我们使用旧的Qt QObject::connect信号槽参数一样

就像指定发送方和接收方的经典信号/时隙连接一样,您可以指定 QObject 上下文以连接到 lambda:

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

这意味着插槽/lambda将在您指定的上下文的事件循环中排队:
https://doc.qt.io/qt-5/qobject.html#connect-5