Запуск слота лямбда-функции в экземпляре потока QWidgets

В настоящее время я создаю поток.
Если этот поток хочет взаимодействовать с основным потоком, чтобы взаимодействовать с графическим интерфейсом пользователя, он излучает сигналы, которые подключены к слотам в основном потоке виджетов. Все работает нормально.
Однако для этого решения мне нужно вернуться к исходной форме графического интерфейса пользователя и добавить в нее слоты.

Я хотел знать, могу ли я просто сделать это с помощью лямбда-функций. Например, в следующем примере класс foo запускается в отдельном потоке. Нравится

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

Это дает ошибку, что виджет должен быть создан в потоке графического интерфейса. И я это понимаю.

Я хотел знать, есть ли у меня способ указать запускать этот слот на mptr экземпляре. Как мы это делаем, используя старый параметр слота сигнала Qt QObject::connect


person Rajeshwar    schedule 04.03.2014    source источник
comment
Что такое mptr? Является ли это переменной-членом класса, в котором вы используете этот код?   -  person Praetorian    schedule 04.03.2014
comment
mptr - это адрес QMainWindow, который должен отображать окно сообщения   -  person Rajeshwar    schedule 04.03.2014
comment
Я думаю, здесь отсутствует функция / предложение, что вы ищете, не так ли? bugreports.qt-project.org/browse/QTBUG-32339   -  person fasked    schedule 04.03.2014


Ответы (1)


Как и при классическом соединении сигнал / слот, где вы указываете отправителя и получателя, вы можете указать контекст 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

person ymoreau    schedule 17.11.2017