2014-09-25 3 views
0

에 paintEvent를 호출합니다 왼쪽, 나는이 mousePressEvent의 영향을 테스트입니다 :mousePressEvent를 방지하는 방법 - 아래이 프로그램에서 PyQt는

import sys 
from PyQt4 import QtGui, Qt, QtCore 


class Test(QtGui.QFrame): 
    def __init__(self): 
     QtGui.QFrame.__init__(self) 
     self.setGeometry(30,30,500, 500) 
     self.show() 

    def paintEvent(self, e=None): 
     print "paintEvent" 
     qp = QtGui.QPainter() 
     qp.begin(self) 
     qp.drawRect(30,30,80,80) 
     qp.end() 

    def mousePressEvent(self, event): 
     if event.button() == QtCore.Qt.RightButton: 
      print "mousePressEvent- Right" 
     else: 
      print "mousePressEvent- Left" 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    ex = Test() 
    sys.exit(app.exec_()) 

는 내가 보는 첫 번째 마우스 왼쪽 버튼으로 클릭, 프레임의 paintEvent가 호출에 그 . 이것은 프레임이 포커스를 얻었을 때 다시 그려야하기 때문입니다. 어떤 방법이 있다면 페인트 이벤트를 피하고 프레임의 모든 그림은 그대로입니다. 그 이유는 내 실제 프로그램에서 paintEvent가 너무 무거워서 가능한 한 적은 시간에 실행하려고하기 때문입니다.

그럴 수 없다면 왼쪽 버튼을 클릭 할 때 초점이 맞지 않게하는 방법이 있습니까?

+0

예, 포커스가 변경된 경우 (실제 클릭이 아닌 경우) 페인트가 발생할 수 있습니다. 분명한 사실은 다시 그리기가 실제로 필요한지 아닌지를 나타내는 scene_was_changed 플래그를 갖는 것입니다. 실제로 paintEvent의 호출을 변경하려면 focusIn 및 focusOut 이벤트를 가로 챌 수 있습니다. – mdurant

+0

이벤트를 거부하려면 event.ignore()를 사용하십시오. – Achayan

답변

0

여기서 플랫폼 별 차이점이 있는지 여부는 알 수 없지만 Linux에서 예제 코드를 시도하면 프레임을 클릭 할 때 paintEvent이 표시되지 않습니다.

기본적으로 QFrame은 모든 종류의 포커스를 허용하도록 구성되지 않았기 때문에 실제로 놀라운 것은 아닙니다. 작업 예제를 얻으려면, 내가 명시 적으로처럼 focus policy을 설정했다 : 어쩌면 기본값이 명시 적으로 초점을지고 프레임을 방지하기 위해, 어떻게 든 다른 플랫폼에서 서로 다른, 그래서이다

class Test(QtGui.QFrame): 
    def __init__(self): 
     QtGui.QFrame.__init__(self) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 

하지만 당신은 수도 이 작업을 수행해야합니다 :

 self.setFocusPolicy(QtCore.Qt.NoFocus)