2014-03-04 90 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

相關問題