2014-09-08 3 views
6

My Qt 응용 프로그램에 여러 스레드가 있습니다.QWidget :: repaint : 진행률 막대를 업데이트 할 때 재귀 페인트가 감지되었습니다.

는 QWidget :: 다시 그리기 : 중 하나는 ui이 런타임 오류를 발생시키는 class Interface : public QMainWindow의 객체와

void Interface::SyncUI() { 
QWidget* bar_widget = ui.tableWidget->cellWidget(0,4); 
QProgressBar* bar_widget2 = dynamic_cast <QProgressBar*> (bar_widget); 
bar_widget2->setValue((int)percentage); 
} 

입니다 ui->SyncUI()를 호출 내가 이걸 발견 재귀 재 페인트가

검출 https://qt-project.org/forums/viewthread/24921 그러나 나는 왜 위젯 값을 막대 그래프에서 설정하는 것이 불법인지 이해하지 못합니다.

감사합니다.

+1

[* QObject가 재 입력이지만 GUI 클래스, 특히 QWidget 및 모든 하위 클래스는 재진입 가능하지 않습니다. 주 스레드에서만 사용할 수 있습니다. *] (http://qt-project.org/doc/qt-5/threads-qobject.html) – thuga

답변

9

메인 스레드 이외의 스레드에서 직접 위젯과 GUI 관련 항목에 액세스해서는 안됩니다. 또한 다른 스레드의 객체에서 함수를 직접 호출하는 것은 불법이며 충돌 및 정의되지 않은 동작으로 이어집니다.

진도 표시 줄을 업데이트하는 올바른 방법은 신호 슬롯 메커니즘을 사용하는 것입니다. 스레드의 신호를 진행 막대를 업데이트하는 위젯의 슬롯에 연결하기 만하면됩니다. 새로운 값을 설정하고 싶을 때마다 신호를 내 보내면됩니다. 신호에는 진행률을 포함하는 인수가있을 수도 있습니다.

관련 문제