PyQT에서 이벤트 핸들러 바인딩

Techniquab

PyQt5를 사용하면 개체에 바인딩 할 수있는 특정 이벤트 처리기와 메서드로 구현할 때만 작동하는 다른 이벤트 처리기가 있습니다. 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가 다른 점은 무엇입니까 ? 내가 원하는대로 작동하도록 어떻게 강제 할 수 있습니까?

Eyllanesc

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

for 루프에서 이벤트 핸들러 바인딩

분류에서Dev

핸들러에 바인딩 된 jQuery 이벤트 제거

분류에서Dev

객체와 함수를 jQuery '변경'이벤트 핸들러에 바인딩

분류에서Dev

Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

분류에서Dev

Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

분류에서Dev

이 이벤트 핸들러를 jQuery 플러그인에 어떻게 바인딩합니까?

분류에서Dev

핸들러에서 자바 스크립트 제거 이벤트,

분류에서Dev

Telerik MVC ClientTemplates에서 이벤트 핸들러를 어떻게 바인딩 할 수 있습니까?

분류에서Dev

이벤트 핸들러를 jQuery의 여러 요소 변수에 바인딩 하시겠습니까?

분류에서Dev

바인딩 할 테이블 행에 대한 반응 (이) 클릭 이벤트 핸들러

분류에서Dev

HTML에서 다중 인수 onMouseover 이벤트 핸들러 전달

분류에서Dev

.on () 이벤트 핸들러 앞에 확인 대화 확인 추가

분류에서Dev

이름이 지정되지 않은 함수를 사용하여 요소를 JS 이벤트 핸들러에 바인딩 / 바인딩 해제

분류에서Dev

여러 이벤트 핸들러를 스크롤 이벤트에 바인딩하면 성능이 저하됩니까?

분류에서Dev

이벤트 핸들러에서 대기

분류에서Dev

typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

분류에서Dev

동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

분류에서Dev

여러 이벤트가있는 jQuery .on () 메서드-이벤트 핸들러 함수에 인수 전달

분류에서Dev

JavaScript의 이벤트 핸들러에 올바른이 컨텍스트를 어떻게 제공하거나 바인딩합니까?

분류에서Dev

이벤트 핸들러가 문서에 첨부되었는지 확인

분류에서Dev

클래스 인스턴스에서 이벤트 핸들러 가져 오기

분류에서Dev

React에서 이벤트 핸들러 외부에서 바인딩 된 함수를 실행하는 방법은 무엇입니까?

분류에서Dev

jQuery에서 DOM을 만들기 전에 이벤트 바인딩

분류에서Dev

Jquery .on () 함수가 PHP에 의해 동적으로 생성 된 요소와 이벤트 핸들러를 올바르게 바인딩하지 않습니다.

분류에서Dev

ajax가 진행되는 동안 이벤트 핸들러 바인딩 해제

분류에서Dev

닫기 버튼으로 jQuery UI Accordion 확장-이벤트 핸들러 바인딩

분류에서Dev

jQuery에서 여러 이벤트를 바인딩하는 방법

분류에서Dev

JavaScript에서 이벤트 리스너를 여러 번 바인딩

분류에서Dev

이벤트 핸들러에 인수를 어떻게 전달합니까?

Related 관련 기사

  1. 1

    for 루프에서 이벤트 핸들러 바인딩

  2. 2

    핸들러에 바인딩 된 jQuery 이벤트 제거

  3. 3

    객체와 함수를 jQuery '변경'이벤트 핸들러에 바인딩

  4. 4

    Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

  5. 5

    Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

  6. 6

    이 이벤트 핸들러를 jQuery 플러그인에 어떻게 바인딩합니까?

  7. 7

    핸들러에서 자바 스크립트 제거 이벤트,

  8. 8

    Telerik MVC ClientTemplates에서 이벤트 핸들러를 어떻게 바인딩 할 수 있습니까?

  9. 9

    이벤트 핸들러를 jQuery의 여러 요소 변수에 바인딩 하시겠습니까?

  10. 10

    바인딩 할 테이블 행에 대한 반응 (이) 클릭 이벤트 핸들러

  11. 11

    HTML에서 다중 인수 onMouseover 이벤트 핸들러 전달

  12. 12

    .on () 이벤트 핸들러 앞에 확인 대화 확인 추가

  13. 13

    이름이 지정되지 않은 함수를 사용하여 요소를 JS 이벤트 핸들러에 바인딩 / 바인딩 해제

  14. 14

    여러 이벤트 핸들러를 스크롤 이벤트에 바인딩하면 성능이 저하됩니까?

  15. 15

    이벤트 핸들러에서 대기

  16. 16

    typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

  17. 17

    동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

  18. 18

    여러 이벤트가있는 jQuery .on () 메서드-이벤트 핸들러 함수에 인수 전달

  19. 19

    JavaScript의 이벤트 핸들러에 올바른이 컨텍스트를 어떻게 제공하거나 바인딩합니까?

  20. 20

    이벤트 핸들러가 문서에 첨부되었는지 확인

  21. 21

    클래스 인스턴스에서 이벤트 핸들러 가져 오기

  22. 22

    React에서 이벤트 핸들러 외부에서 바인딩 된 함수를 실행하는 방법은 무엇입니까?

  23. 23

    jQuery에서 DOM을 만들기 전에 이벤트 바인딩

  24. 24

    Jquery .on () 함수가 PHP에 의해 동적으로 생성 된 요소와 이벤트 핸들러를 올바르게 바인딩하지 않습니다.

  25. 25

    ajax가 진행되는 동안 이벤트 핸들러 바인딩 해제

  26. 26

    닫기 버튼으로 jQuery UI Accordion 확장-이벤트 핸들러 바인딩

  27. 27

    jQuery에서 여러 이벤트를 바인딩하는 방법

  28. 28

    JavaScript에서 이벤트 리스너를 여러 번 바인딩

  29. 29

    이벤트 핸들러에 인수를 어떻게 전달합니까?

뜨겁다태그

보관