2014-07-13 1 views
0

데이터 개체 (클래스 인스턴스)를 setData() 메서드가없는 QLabel 위젯에 연결해야합니다. QLabel을 확장하여 데이터 첨부를 지원하는 방법이 있습니까?setData() 메서드가없는 위젯에 데이터 개체를 설정하는 방법

+0

서브 클래 싱? ... –

+0

@three_pineapples 필요 없음 - 내 대답 참조. – BlackJack

+0

나는 그것이 필요하지 않다는 것을 안다, 그러나 나는가 p픈 모양을 패치하는 오리 펀치 또는 원숭이를 고려할 것입니다. 서브 클래 싱이 선호되는 방법입니다. –

답변

1

서브 클래 싱을 제안합니다. @ BlackJack의 대답은 효과가 있지만 일반적으로 문제에 직면 할 때 "오리 펀치"/ "원숭이 패치"가난한 형태로 간주됩니다. wikipedia에서

감안할 서면 또는 제대로 문서화 원숭이 패치가 문제가 발생할 수 있습니다 : 그들은 패치가 더 이상 해당되지 패치 된 개체에 대한 가정을 할 때 문제가 업그레이드 될 수 있습니다

  • ; 새 릴리스로 변경 한 제품이 변경 사항을 패치하면 매우 잘 손상 될 수 있습니다. 이런 이유로 원숭이 패치는 종종 조건부로 만들어지며 적절한 경우에만 적용됩니다.

  • 두 개의 모듈이 동일한 방법으로 원숭이 패치를 시도하는 경우 원숭이 패치가 alias_method_chain과 같은 패턴으로 작성되지 않는 한 그 중 하나 (마지막 하나가 실행 됨)가 효과가 있고 다른 패치는 효과가 없습니다.

  • 디스크의 원래 소스 코드와 패치의 존재를 모르는 사람들에게 매우 혼동을 줄 수있는 관찰 된 동작간에 불일치를 만듭니다. 객체가 요구

원숭이 패치를 사용하지 않을 경우에도, 일부는 강한 캡슐화를 시행 함께 호환되지 않는 프로그래밍 언어로 원숭이 패치를 사용할 수있는 능력 때문에,이 기능의 가용성에 문제가 참조 - 개체 사이의 기능 모델.

이와 같이 서브 클래 싱이 선호되는 방법입니다. 예를 들면 다음과 같습니다.

class MyLabel(QLabel): 
    def __init__(self, *args, **kwargs): 
     QLabel.__init__(self, *args, **kwargs) 
     self._data = None 

    def data(self): 
     return self._data 

    def setData(self, data): 
     self._data = data 

다음은 다른 클래스의 Qt 구문과 일치합니다.

또한

class MyLabel(QLabel): 
    def __init__(self, *args, **kwargs): 
     QLabel.__init__(self, *args, **kwargs) 
     self._data = {} 

    def data(self, role = Qt.DisplayRole): 
     if role in self._data: 
      return self._data[role] 
     return None 

    def setData(self, data, role = Qt.DisplayRole): 
     self._data[role] = data 

은 분명히이 (Qt는 그것을 사용하지 않습니다) 만 파이썬 코드로 사용하기위한의 것입니다 (다른 Qt는 클래스처럼) 여러 역할에 대한 저장 데이터를 지원하도록 확장 할 수있다.

+0

두 번째 예제를 얻었지만 첫 번째 예제는 사소한 게터와 세터를 사용하기 때문에 꽤 unpythonic합니다. 파이썬은 자바가 아닙니다. – BlackJack

+0

@BlackJack 요점은 Pythonic이 아니라 PyQt와 일치하기위한 것이 었습니다. PyQt는 C++ GUI 툴킷 (Qt)을 감싸는 래퍼입니다. –

1

속성에 데이터를 할당하려고 했습니까?

In [2]: from PyQt4 import QtCore, QtGui 

In [3]: import sys 

In [4]: app = QtGui.QApplication(sys.argv) 

In [5]: label = QtGui.QLabel('Test') 

In [6]: label.answer = 42 

In [7]: label.answer 
Out[7]: 42 
관련 문제