문제

WX (및 wxpython)는 pyqt에서 놓친 두 가지 이벤트가 있습니다.

  • EVT_IDLE 그것은 프레임으로 전송되고 있습니다. 응용 프로그램의 상태에 따라 다양한 위젯을 업데이트하는 데 사용할 수 있습니다.
  • EVT_UPDATE_UI 다시 칠하고 업데이트해야 할 때 위젯으로 전송되고 있으므로 핸들러에서 상태를 계산할 수 있습니다.

이제 PYQT는 이것들을 가지고 있지 않은 것 같고 PYQT 책은 updateUi 방법 및 수동으로 호출합니다. GUI를 업데이트 할 수있는 방법의 많은 수동 통화를 피하기 위해 0.1 초당 타이머에서 전화를 걸었습니다. 내가 뭔가를 놓치고 있습니까? 이것을 달성하는 더 좋은 방법이 있습니까?


예 : 일부 처리를 시작하는 시작 버튼이있는 간단한 앱이 있습니다. 메뉴를 사용하여 파일을 열 때만 시작 버튼을 활성화해야합니다. 또한 상태 표시 줄에는 정보를 표시하는 영구 위젯이 있습니다.

내 응용 프로그램에는 다음과 같습니다.

  1. 파일이 열리기 전에 (이 상태에서 상태 표시 줄에 특별한 것을 표시하고 시작 버튼이 비활성화됩니다)
  2. 파일이 열리고 처리가 시작되지 않았습니다. 시작 버튼이 활성화되고 상태 표시 줄이 다른 것을 보여줍니다.
  3. 처리가 실행 중입니다 : 시작 버튼은 이제 "정지"라고 표시되고 상태 표시 줄은 진행 상황을보고합니다.

WX에서는 버튼의 업데이트 UI 이벤트가 상태를 처리하고 텍스트의 텍스트와 응용 프로그램 상태에 따라 활성화되는지 여부를 처리했습니다. 상태 표시 줄에 대해서도 동일합니다 (또는 EVT_IDLE을 사용합니다).

QT에서는 상태에 영향을 줄 수있는 여러 방법으로 버튼을 업데이트하거나 Update_UI 메소드를 작성하고 타이머에서 주기적으로 호출해야합니다. 더 "QT"-ish 방법은 무엇입니까?

도움이 되었습니까?

해결책

wxwidgets에서 evt_update_ui를 사용하면 WXWIDGET과 QT가 개발자가 코드의 이벤트를 처리 할 것을 기대하는 방식의 근본적인 차이 중 하나를 강조하는 것으로 보입니다.

QT를 사용하면 각 슬롯의 "비즈니스 로직"을 처리하거나 전용 메소드로 위임하는 사용자 인터페이스의 위젯 간 신호와 슬롯을 연결합니다. 당신은 일반적으로 GUI의 각 위젯을 별도의 변경에 대해 걱정하지 않습니다. 모든 리 페인트 요청이 이벤트 큐에 배치되고 컨트롤이 이벤트 루프로 돌아올 때 전달되기 때문입니다. 효율성을 위해 일부 페인트 이벤트가 함께 병합 될 수도 있습니다.

따라서 신호 및 슬롯이 상태 변경을 처리하는 데 사용되는 일반 QT 응용 프로그램에서는 기본적으로 업데이트가 자동으로 발생하기 때문에 응용 프로그램 상태를 모니터링하고 위젯을 업데이트하는 유휴 메커니즘이 필요하지 않습니다.

QT 에서이 이벤트와 동등한 이유를 설명하기 위해 자신이하고있는 일에 대해 조금 더 말해야 할 것입니다.

다른 팁

상태 변경을 나타내는 QT 신호를 보내드립니다 (예 : 파일 노포, 처리 상태, 처리 구체). 시작 버튼 및 상태 표시 줄 위젯 (또는 서브 클래스)을 관리하는 객체의 슬롯은 유휴 이벤트에서 현재 상태에 대한 "폴링"대신 해당 신호에 연결할 수 있습니다.

즉시 이벤트 루프에서 나중에 신호를 연기하려는 경우 (예 : 무언가를하는 데 약간의 시간이 걸리기 때문에) 일반적인 종류가 아닌 "대기"신호-슬롯 연결을 사용할 수 있습니다.

http://doc.trolltech.com/4.5/signalsandslots.html#signals

연결 유형은 Connect () 함수의 선택적 매개 변수입니다.http://doc.trolltech.com/4.5/qobject.html#connect , http://doc.trolltech.com/4.5/qt.html#connectiontype-enum

내가 이해하는 한 Application Message 큐가 비어있을 때 EVT_IDLE이 전송됩니다. QT에는 그러한 이벤트가 없지만 보류 중이벤트가 없을 때 QT에서 무언가를 실행 해야하는 경우 QTIMER를 0 타임 아웃으로 사용해야합니다.

일반적으로 QT-ish 방법은 업데이트가 필요한 기능에서 필요한 경우 버튼/도구 모음을 업데이트 해야하는 경우 일부 기능을 통합하고 프로그램이 필요할 때 해당 기능을 직접 호출하는 것입니다 (예 : UpdateUI 기능).

QT에서 UI 요소의 속성을 변경하면 즉시 다시 그리기를 유발하지는 않지만 이벤트 시스템에서 다시 그리기를 큐를 큐에 대고 가능한 경우 여러 개의 REDRAW 호출이 압축됩니다.

상태와 관련된 여러 변경 사항은 이 블로그 게시물 상태를 더 쉽게 처리하기 위해 QT에 대한 희망적으로 다가오는 추가에 대해. 여러 기능에서는 상태 변수를 전환 할 수 있고 UI의 다른 부분이 일치하도록 업데이트해야하기 때문에 많은 불만을 처리하는 것처럼 보입니다. 이것이 긍정적이지는 않습니다. 이것이 다음 QT 릴리스에 들어가게 될 것입니다 (비록 내기 또는 비슷한 것이 있지만) PYQT가 QT 릴리스를 얼마나 밀접하게 추적하는지 모르겠습니다. 또는 번갈아 개념을 사용하고 자신만의 클래스를 만들어 필요에 따라 상태를 추적 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top