2014-07-10 2 views
1

나는 (바인딩 파이썬 Qt를 사용) 파이썬에서 다음과 같이 상속하여 클릭 QWidget했다 신호를 구현할 수 있습니다.이벤트는 QWidget에 대한 핸들러와 파생 클래스를 구현하고 방지 코드 중복

동일한 기능을 QLabel, QToolBar에 추가하고 싶습니다. 물론 쉽게 동일한 방법으로 코드 중복을 유발할 수 있습니다.

최소한의 코드 중복이 있고 코드가 효율적이고 유지 보수가 쉽다는 점에서 더 나은 대안이 있습니까? Qt와 비슷한/Pythonic 방식은 무엇이 될까요?

하나의 대안은 Qt 애플리케이션 (?)에 이벤트 필터를 설치하여 원하는 위젯으로가는 모든 이벤트를 필터링하는 것일 수 있지만 대상 개체를 구별하지 않으면 서 복잡해 질 수 있습니다.

답변

1

당신은 서브 클래스

def createClickableSubclass(parent): 
    class ClickableSubclass(parent): 
     clicked_ = QtCore.Signal(QtGui.QMouseEvent) 

     def __init__(self, *args, **kwargs): 
      super(ClickableSubclass, self).__init__(*args, **kwargs) 

     def mousePressEvent(self, event): 
      self.clicked_.emit(event) 

    return ClickableSubclass 


MyLabel = createClickableSubclass(QtGui.QLabel) 
MyToolBar = createClickableSubclass(QtGui.QToolBar) 
를 정의하는 함수를 만들 수

편집 : 귀하의 의견을 참조하여, 당신은 다음과 같은 서브 클래스를 사용합니다 :

aLabel = MyLabel('Label text') 
aLabel.setStyleSheet('color: yellow') 
+0

필자의 파이썬 지식은 확실히 포괄적이지 않습니다. 함수 내에서 클래스를 정의 할 수 있습니까? 생성 된 클래스의 형식 이름은 무엇입니까? 예를 들어 스타일 시트에서 어떻게 지정 하시겠습니까? – Trilarion

+0

예, 할 수 있습니다 (이것은 데코레이터의 작동 방식입니다). 클래스의 이름은 당신이 그것을 할당하기로 선택했다면, 나의 예제의 경우에 이것은'MyLabel'과'MyToolBar'입니다. 이것들은 클래스의 인스턴스가 아니라 클래스 자체의 정의에 대한 핸들입니다. – user3419537

+0

고마워, 나는 여기서 많은 것을 배웠다. – Trilarion