PyQt5를 사용하면 개체에 바인딩 할 수있는 특정 이벤트 처리기와 메서드로 구현할 때만 작동하는 다른 이벤트 처리기가 있습니다. changeEvent 및 event 는 이후 유형의 예입니다.
아래 예제에서 프로그래밍 방식 으로 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가 메서드의 캐시를 생성한다는 것입니다 (캐시에 언제 어떤 메서드가 저장되는지는 알 수 없음).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다