2014-03-04 3 views
4

현재 스레드를 만들고 있습니다.
해당 스레드가 GUI와 상호 작용하기 위해 주 스레드와 통신하려는 경우 주 위젯 스레드의 슬롯에 연결된 신호를 내 보냅니다.이 기능은 정상적으로 작동합니다.
그러나이 솔루션의 경우 원래 GUI 양식으로 돌아가 슬롯을 추가해야합니다.QWidgets 스레드의 인스턴스에서 람다 함수 슬롯 실행

람다 함수를 사용하여이 작업을 수행 할 수 있는지 알고 싶습니다. 예를 들어 다음 예제에서는 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 신호 슬롯 매개 변수를 사용하는 것처럼

+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