gpt4 book ai didi

python - 在 PyQT 中绑定(bind)事件处理程序

转载 作者:行者123 更新时间:2023-12-05 03:49:36 27 4
gpt4 key购买 nike

使用 PyQt5,我可以将某些事件处理程序绑定(bind)到我的对象,而其他事件处理程序只有在我将它们实现为方法时才有效。 changeEventevent 是后一种类型的示例。

您可以在下面的示例中看到,我可以通过编程方式将 keyPressEvent 处理程序添加到我的小部件,但我不能为 changeEvent 做同样的事情。

from PyQt5 import QtGui, QtWidgets, QtCore

import types

def keyPressEvent(self, key: QtGui.QKeyEvent) -> None:
#works
print(key.isAutoRepeat())

def changeEvent(self, a0: QtCore.QEvent) -> None:
#doesn't work
print("bound change event", a0.type())


bindable = [keyPressEvent, changeEvent]

def bind_key_functions(target):
for bound in bindable:
setattr(target, bound.__name__, types.MethodType(bound, target))

class my_widget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("w1")
bind_key_functions(self)


class my_widget2(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("w2")

def changeEvent(self, a0: QtCore.QEvent) -> None:
#this does work
print("derived change event", a0.type())

app = QtWidgets.QApplication([])
mw1 = my_widget()
mw1.show()
mw2 = my_widget2()
mw2.show()
app.exec_()

是什么让changeEvent 与众不同?我怎样才能强制它按照我的意愿行事?

最佳答案

使用 setattr 覆盖方法是一个糟糕的选择,因为它不是很优雅,如果您想监听另一个 QWidget 的事件,那么最好使用事件过滤器。

from PyQt5 import QtGui, QtWidgets, QtCore


class Binder(QtCore.QObject):
def __init__(self, qobject):
super().__init__(qobject)
self._qobject = qobject
self.qobject.installEventFilter(self)

@property
def qobject(self):
return self._qobject

def eventFilter(self, obj, event):
if self.qobject is obj:
print(event.type(), event)

return super().eventFilter(obj, event)


class My_Widget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("w1")
Binder(self)


class My_Widget2(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("w2")


app = QtWidgets.QApplication([])
mw1 = My_Widget()
mw1.show()
mw2 = My_Widget2()
mw2.show()
app.exec_()

另一方面,对于哪些方法可以赋值,哪些方法可以不赋值,并没有文档记载,所以要想找到原因必须要分析sip和pyqt5的源码。很少有人指出 PyQt5 创建了方法的缓存(不知道何时或什么方法存储在缓存中)。

关于python - 在 PyQT 中绑定(bind)事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63837802/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com