2011-01-03 4 views
0

QThread를 만드는 주 (GUI) 스레드가 있습니다.QThread에서 실행중인 C 코드에서 QMessageBox 표시

QThread에서 QMessageBox를 표시해야하는 C 함수를 호출하고 있습니다. 지금까지 단순히 다음 코드를 사용했습니다 :

void notify(char *str) 
{ 
    QMessageBox::information(0, "", QString(str)); 
} 

C 코드에서 간단히 사용하고 C 코드에서 호출했습니다. 이것은 스레드 없이는 잘 동작하지만 이제는 스레드로 인해 다른 스레드에서 GUI 함수를 호출 할 수 없기 때문에 오류가 발생합니다.

일반적으로 이것은 this question의 답변과 같은 신호를 사용하여 회피 할 수 있습니다. 그러나 C 코드에서이 작업을 수행 할 수 있을지는 의문입니다.

그래서 C 코드를 GUI 스레드와 통신하여 QMessageBox를 표시하도록 할 수 있습니까?

감사합니다.

P.

가능하면 C 코드를 건드리지 않고이 작업을 수행하고 싶습니다. (현재로서는 C 코드의 헤더에 extern void notify(char *) 선언이 있고 가능한 경우 해당 코드를 그대로두고 싶습니다.)

당신이 당신의 GUI에 대한 QWidget 또는 QMainWindow 파생 클래스를 가정

답변

3

, 당신은 여기에 다음과 같은 추가 할 수 있습니다. 여기

class MyWidget : public QWidget 
{ 
    Q_OBJECT; 
public:  
    MyWidget() 
    { 
     connect(this, SIGNAL(notify_sig(QString)), 
       this, SLOT(notify_slot(QString)), 
       Qt::QueuedConnection); 
    } 

    void notify(QString str) 
    { 
     emit notify_sig(str); 
    } 

    signals: 
     void notify_sig(QString str); 

    slots: 
     void notify_slot(QString str) 
     { 
      QMessageBox::information(0, "", str); 
     } 
}; 

위젯 클래스의 구성원 인 공공 기능 notify()이를 MyWidget::notify() 결과를 호출 대기중인 conn을 통해 자신에게 전송되는 신호 (이것은 GUI 슬롯에서 슬롯이 호출되게 할 것이다). 이제 C notify() 호출은 위젯/창을 notify() 함수로 호출하면됩니다. C notify() 함수에서 사용할 수있는 위젯에 대한 포인터가 없으므로 까다로울 수 있습니다.

일반적으로 C 인터페이스는 사용자가 void* 값을 전달할 수있게하고 알림 호출로 해당 값을 반환합니다. 이렇게하면 C 함수가 호출 될 때 MyWidget에 대한 포인터를 전달한 다음 notify() 구현의 MyWidget으로 다시 캐스트 할 수 있습니다.

MyWidget* wid = ...; 
C_function(arg1, ..., wid); 

//... 

void notify(char* str, void* userdata) 
{ 
    MyWidget* wid = static_cast<MyWidget*>(userdata); 
    wid->notify(QString(str)); 
} 

C 인터페이스를 변경할 수없는 경우 위젯/창 포인터를 가져 오는 일종의 전역 방식을 사용해야 할 수도 있습니다.

이 코드를 테스트하지 않았으므로 더 쉬운 방법 일 수 있습니다.

+0

답변 해 주셔서 감사합니다. 내 대답을 약간 잘못 읽었거나 잘못 설명했다고 생각하지만'notify (not-class) 함수는 실제로 C++ 코드에있다. (C 코드는 단지 그것을 호출한다). ** 당신의 예제에서'MyWidget'에 대한 포인터를 얻는다. 그래서, 당신이 제안한대로 신호와 슬롯을 사용하는 메인 윈도우 클래스의 메소드를 호출 할 수 있습니다. 그러나 어쨌든, 나는 당신의 접근 방식을 사용했다. 컴파일러가'public signals '을 좋아하지 않는다는 것만 제외하면 잘 동작한다. 단지'signals'이다. – houbysoft

관련 문제