2014-09-25 33 views
0

在下面這個節目,我測試mousePressEvent的影響:如何避免mousePressEvent - 左邊點擊呼叫的paintEvent在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被調用,並在框架中的每個圖紙仍然完好。原因是因爲在我的真實程序中,paintEvent非常重,我希望儘可能少運行它。

如果這是不可能的,有沒有辦法避免框架獲得焦點時,左鍵單擊它?

+0

是的,油漆可以發生在焦點改變(而不是實際的點擊)。顯而易見的事情是有一個scene_was_changed標誌,說明是否實際需要重繪。要真正改變paintEvent的調用,你可以攔截focusIn和focusOut事件。 – mdurant 2014-09-25 19:22:29

+0

如果你想拒絕事件,那麼你可以使用event.ignore() – Achayan 2014-09-25 20:04:53

回答

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)