在下面的这个程序中,我正在测试mousePressEvent:的影响
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非常重,我想尽可能少地运行它。
如果这是不可能的,有没有一种方法可以避免左键点击时帧聚焦?
我不知道这里是否存在特定于平台的差异,但当我在Linux上尝试示例代码时,单击框架时没有paintEvent
。
这并不奇怪,因为在默认情况下,QFrame没有配置为接受任何类型的焦点。为了让这个例子发挥作用,我必须明确地设置焦点策略,如下所示:
class Test(QtGui.QFrame):
def __init__(self):
QtGui.QFrame.__init__(self)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
但是,在其他平台上,默认值可能有所不同,因此,为了明确防止框架成为焦点,您可能需要这样做:
self.setFocusPolicy(QtCore.Qt.NoFocus)