2010-08-16 5 views
3

20 개의 다른 클래스를 사용하는 응용 프로그램이 있습니다. 프로그램 실행은 메인 윈도우에서 시작됩니다. 진행 대화 상자를 시작합니다. 다른 목적을 위해 다른 클래스를 사용할 것입니다. 실행이 특정 클래스로 이동하고 mainwindow 클래스로 돌아와서 필요한 각 함수 호출 후에 진행 대화 상자를 업데이트합니다. 이제 문제는 실행이 메인 윈도우 클래스에서 멀어 질 때 진행 대화 상자가 멈추는 것입니다. 취소 버튼에 액세스 할 수 없으므로 필요한 시간에 실행을 중지 할 수 없습니다.QT 진행 대화 상자 취소 버튼이 강조 표시되지 않습니다.

mainclass :: mainclass() {

ProgressDialog-> 간부();

x->add(); 

updateProgressDialog(); 

y->do(); 

updateProgressDialog(); 

zz->bring(); 

updateProgressDialog(); 

}

// X, Y, Z 세 개의 다른 클래스이다.

이것은 실행 방법입니다. 메인 클래스에서 함수를 입력하자마자 진행 대화 상자가 시작됩니다. 다른 클래스의 함수를 호출 할 수 있습니다. 함수는 상당한 시간이 걸립니다. 실행 부분을 수행 할 스레드가 호출되었지만 진행 다이아 로그를 취소 할 수 없습니다. proggress 대화 상자에서 취소 버튼을 누를 때와 같이 프로그램 실행을 중지하고 싶습니다.

이 문제를 해결하는 방법을 알려주세요. 희망 나는 여기 분명하다.

+0

당신은 실행 부분을 할 수있는 스레드를 호출 언급 .. 즉, y 축>) x 축이> (추가하는 것이 의미 하는가 do() 및 zz-bring()을 스레드에 넘겨주고 즉시 리턴 할 수 있습니까? –

답변

1

정확히 어떤 계산이 스레드에서 수행되고 있는지를 모르는 상태에서 문제를 격리하기가 어렵습니다. 어쩌면이 도움이 될 수 있습니다 (기준 :의 Witold Wysota) 긴 작업 수행 :에서 Keeping the GUI Responsive

발췌 (에 관계없이 신호와 슬롯의 사용의) 긴 계산하는 동안 모든 이벤트 처리를
이 정지됩니다. 결과적으로 GUI는 새로 고침되지 않고 사용자 입력이 처리되지 않고 네트워크 활동이 중지되고 타이머가 작동하지 않습니다. 응용 프로그램은 고정 된 것처럼 보이며 실제로 시간 집약적 인 작업과 관련이없는 부분은 겨울 왕국.

0

호출중인 함수가 Qt 이벤트 루프를 처리하지 않습니다. exec()를 호출하기 때문에 모달 진행률 표시 줄을 사용하고 있습니다. 즉, Qt는 대화 상자를 업데이트 할 때만 제어 권한을 얻습니다.

이 문제를 해결하기 위해 알고있는 유일한 방법은 대화 상자를 모덜리스로 코딩하는 것이지만 이벤트 루프를 처리 할 기회를 제공해야합니다.

는 Qt는 워드 프로세서의 세부 공정한 금액에 설명되어 있습니다 : QProgressDialog

관련 문제