2016-10-13 12 views
0

PyQt/PySide에서 구현 한 모델링 언어 용 IDE가 작고 편집중인 파일의 다른 섹션으로 건너 뛰는 코드 탐색기를 구현하려고합니다.QPlainTextEditor.textChanged 이벤트에 대한 반응을 지연/묶음 처리 할 수 ​​있습니까?

현재의 구현 : (1) QPlainTextEditor.textChanged에 연결 (2) 변경이 될 때마다, (엉성하게), 확인을 작동하는 것 같다 네비게이터 창

을 파일을 구문 분석하고 업데이트 할 수 있지만 더 느린 시스템에서 대용량 파일의 주요 성능 문제가 발생할 수 있다고 생각합니다. 특히 향후에 더 많은 내용이 textChanged에 연결되는 경우 더욱 그렇습니다.

내 질문 : 여기있는 사람이 이벤트에 대한 반응이 지연되어 짧은 기간 내에 여러 이벤트 (즉, 키 입력)가 단일 업데이트 (예 : 초당 한 번)를 트리거합니다. 그리고 이것을하기위한 적절한 QT 방법이 있습니까?

감사합니다, 마이클

답변

3

일부 "지연"을 원하는 경우 타이머를 사용하여 시도 할 수 있습니다.

다른 결과를 사용하는 두 가지 방법이 있습니다. 그래서 이것은 일종의 난 단지 C++ Qt는 알고 있지만 나는 같은 일이 PyQt는 유효 가정


하나는 단지 더 입력이 일정 시간 동안 이루어지지 된 후

가 주 분석한다 "의사 코드"의 개념을 얻길 바랍니다.

QTimer timer; //somewhere timer.setSingleShot(true); //only fire once connect(timer,QTimer::timeout(),OnTimerDone(...); OnTextChanged(...) { timer.start(500); //wait 500ms } OnTimerDone(...) { DoStuff(...); } 

는 모든 입력 타이머를 다시 시작합니다, 그래서 때 당신은 전화 타이머는 timeout 신호가 방출되지 수행되지 않습니다. 일정 시간 동안 입력이 없으면 시간 초과가 발생하고 파일을 구문 분석합니다.


두 번째 옵션은 정기 타이머 (singleShot(false))를 실행하는 것입니다.

타이머를 초당 시작하십시오. timeout은 1 초에 한 번 호출됩니다. 입력을 변경할 때 true로 설정하는 변수와 파일을 구문 분석 할 때 false로 설정할 수 있습니다. 따라서 아무 것도 변경되지 않은 경우 파싱을 피하십시오.

C++ Qt에서는 슬롯이 GUI 스레드에서 호출되기 때문에 멀티 스레딩에 대해 걱정할 필요가 없습니다. 나는 그것이 파이썬과 동일하다고 생각하지만 아마 이것을 체크해야 할 것이다.

+0

아름답게 작동합니다. 감사합니다. (나는 타이머를 사용하는 것에 대해 걱정했습니다. 무언가를 함께 해킹하는 것처럼 들렸지 만, 이것은 매우 간단하고 우아합니다!) –

+0

@MichaelClerx는 칭찬에 감사드립니다. :) 그런 것들은 타이머의 일반적인 용도 중 하나입니다. GUI 응용 프로그램에서 "잠"수 없으므로 타이머는 모든 지연 관련 goto입니다. – Hayt