데이터 개체 (클래스 인스턴스)를 setData() 메서드가없는 QLabel
위젯에 연결해야합니다. QLabel을 확장하여 데이터 첨부를 지원하는 방법이 있습니까?setData() 메서드가없는 위젯에 데이터 개체를 설정하는 방법
답변
서브 클래 싱을 제안합니다. @ 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는 클래스처럼) 여러 역할에 대한 저장 데이터를 지원하도록 확장 할 수있다.
두 번째 예제를 얻었지만 첫 번째 예제는 사소한 게터와 세터를 사용하기 때문에 꽤 unpythonic합니다. 파이썬은 자바가 아닙니다. – BlackJack
@BlackJack 요점은 Pythonic이 아니라 PyQt와 일치하기위한 것이 었습니다. PyQt는 C++ GUI 툴킷 (Qt)을 감싸는 래퍼입니다. –
속성에 데이터를 할당하려고 했습니까?
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
- 1. 호출 메서드가없는 UISegmentedControl을 설정하는 방법
- 2. 내부 개체를 설정하는 방법 DataGridview의 데이터 속성
- 3. 개체를 null로 설정하는 방법
- 4. GWT의 복합 위젯에 발표자를 설정하는 방법
- 5. SplitLayoutPanel - 센터 위젯에 최소 크기를 설정하는 방법
- 6. iOS10 오늘 위젯에 어두운 배경을 설정하는 방법
- 7. 여러 개의 onclickpendingintents를 위젯에 설정하는 방법은 무엇입니까?
- 8. 참조로 값 개체를 설정하는 방법
- 9. smartgwt 필터 setData
- 10. Highcharts 스플라인의 JS setData
- 11. XNA의 SetData 메서드를 올바르게 사용하는 방법
- 12. Checkstyle Override 메서드가없는 ParameterNumber
- 13. OnLoad 메서드가없는 System.Windows.Controls.Control
- 14. dijit 위젯에 데이터 속성 유지
- 15. SerializationInfo에 TryGetValue 메서드가없는 이유는 무엇입니까?
- 16. 뷰 내에서 setData 변수를 다시 설정하는 방법은 무엇입니까?
- 17. 태그 위젯에 포커스를 설정하는 방법은 무엇입니까?
- 18. 앱 시작시 위젯에 포커스를 설정하는 방법은 무엇입니까?
- 19. AppleScript에서 "데이터"개체를 조작하는 방법
- 20. C#에서 개체를 C++로 설정하는 방법
- 21. 개체를 내 게임에서 다시 설정하는 방법?
- 22. 개체를 사용하여 jQuery.data()를 설정하는 방법
- 23. 개체를 업데이트하기 위해 캐스케이드를 설정하는 방법
- 24. 객관적인 C에서 개체를 다시 설정하는 방법
- 25. WriteableBitmap SetValue 성능/Texture2D SetData
- 26. 위젯에 활동을 추가하는 방법
- 27. ManagedBean에서 위젯에 액세스하는 방법
- 28. CKEditor SetData JQuery
- 29. JQuery setData 이벤트
- 30. Texture2D SetData 오류
서브 클래 싱? ... –
@three_pineapples 필요 없음 - 내 대답 참조. – BlackJack
나는 그것이 필요하지 않다는 것을 안다, 그러나 나는가 p픈 모양을 패치하는 오리 펀치 또는 원숭이를 고려할 것입니다. 서브 클래 싱이 선호되는 방법입니다. –