【问题标题】:How to avoid mousePressEvent - left click to call paintEvent in PyQt如何避免mousePressEvent - 在PyQt中左键单击调用paintEvent
【发布时间】:2014-09-25 16:27:37
【问题描述】:

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

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

【问题讨论】:

  • 是的,当焦点改变(而不是实际的点击)时,绘画可能会发生。显而易见的事情是有一个 scene_was_changed 标志来说明是否真的需要重绘。要真正改变paintEvent的调用,你可以拦截focusIn和focusOut事件。
  • 如果你想拒绝事件,那么你可以使用 event.ignore()

标签: pyqt focus paintevent mousepress


【解决方案1】:

我不知道这里是否存在特定于平台的差异,但是当我在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2023-03-12
    • 2015-09-27
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多