2012-01-18 3 views
0

QWidget에서 상속받은 클래스의 스레드를 만들고 싶습니다. 사실 QThread를 사용하여 다중 상속을 시도했지만 실패하고 스레드를 사용하여 특정 멤버 함수를 실행하려고합니다. 이것을 어떻게 할 수 있습니까? 누구 아이디어가 있습니까?QWidget에서 상속 한 클래스의 스레드를 만드는 방법은 무엇입니까?

+0

어떻게 "실패"합니까? 빌드 오류? 런타임 에러? –

+2

2 개의 QObject에서 다중 상속은 아니오입니다. 다중 상속에서 일반적인 조상/다이아몬드 문제의 예입니다. – hmn

+0

@ joachim : Build error : 다음과 같은 오류가 발생합니다 : 오류 C2385 : 모호한 액세스 'connect' 1> 기본 'QObject' 1에서 '연결'일 수 있거나 'QObject' – joki

답변

0

중첩 된 클래스를 사용하면 일반적인 위젯 클래스와 중첩 된 실행 메서드에서 필요한 모든 모든 메서드에 대한 포인터를 전달할 수 있습니다. GUI를하기 때문에, 당신은 "threadMethod"어떤는 QWidget 메소드를 호출하지 않아야하지만

class MyWidget : public QWidget 
{ 
    [...] 

    void threadMethod(); 
}; 

class MyThread : public QThread 
{ 
    [...] 

    MyThread(MyWidget* widget) 
     : mWidget(widget) 
    { 
    } 

    void run() 
    { 
     mWidget->threadMethod(); 
    } 

    MyWidget* mWidget; 
}; 

및 따라서 위젯은 소속 :

2

당신은 위젯의 방법을 스레드를 구현하고 호출하는 래퍼 클래스를 사용할 수 있습니다 "main"쓰레드로, QWidget 메쏘드는 쓰레드 - 안전하지 않다!

위젯과 스레드 코드를 완전히 분리하는 것이 좋습니다.

+0

감사합니다. hmn. 하지만 "위젯"이 여기에서는 것은 무엇입니까? – joki

+0

"mWidget"은 위젯에 대한 참조를 보유하는 멤버 변수입니다. 코드 예제에서 명확성을 위해 추가했습니다. – hmn

0

GUI 모듈에 속하는 Qt 클래스는 재진입 가능하지 않습니다. 그들은 반드시 주 스레드에서 실행되어야합니다.

관련 문제