0

在下面的这个程序中,我正在测试 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 真的很重,我想尽可能少地运行它。

如果这是不可能的,有没有办法在左键单击时避免框架获得焦点?

4

1 回答 1

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)
于 2014-09-25T20:24:29.440 回答