Как избежать mousePressEvent - щелкните левой кнопкой мыши, чтобы вызвать paintEvent в PyQt
В этой программе ниже я тестирую эффект 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 очень тяжелый, я хочу запускать его как можно меньше раз.
Если это невозможно, есть ли способ избежать фокусировки кадра при щелчке левой кнопкой мыши по нему?
1 ответ
Я не знаю, есть ли здесь различия между платформами, но когда я пробую пример кода на Linux, нет paintEvent
при нажатии на рамку.
Это не удивительно, потому что по умолчанию QFrame не настроен на прием фокуса любого вида. Чтобы пример работал, мне нужно было явно установить политику фокуса, например так:
class Test(QtGui.QFrame):
def __init__(self):
QtGui.QFrame.__init__(self)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
Но, возможно, значения по умолчанию на других платформах несколько отличаются, поэтому для явного предотвращения фокусировки фрейма вам может потребоваться сделать следующее:
self.setFocusPolicy(QtCore.Qt.NoFocus)