如何避免mousePressEvent-左键单击可在PyQt中调用paintEvent



在下面的这个程序中,我正在测试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)

最新更新