2014-12-11 2 views
0

최근에 새로운 pySide 신호 및 슬롯을 사용하기 시작했으며이를 처리하기 위해 많은 코드가 필요하다는 것을 알게되었습니다. 나는 잘못된 것을하고 누군가가 그것을하는 더 좋은 방법을 가지기를 바랍니다.pySide 신호 및 슬롯 슬롯이 너무 많습니까?

#first I need to declare it at the class level 
class UI(QtGui.QMainWindow): 
    my_signal = QtCore.Signal(str, str) 

# next I need to connect it to something in the UI 
self.my_signal.connect(self._mySignalHandler) 

# then I need the actual handler that does the work: 
@QtCore.Slot(str, str) 
def _mySignalHandler(self, a, b): 
    pass 

# and finally I needs an accessor method for it to use it from the outside the UI class: 
def mySignalAccessor(self, a, b): 
    self.my_signal.emit(a, b) 

이것은 간단한 작업을 수행하는 코드입니다. 나는 결국 비슷하게 불리는 두 가지 메소드와 변수를 가지고 결국 버그를 완전히 잃어버린 좋은 방법이다. 그럴 수있는 더 나은 방법이 있습니까?

답변

0

정의, 연결, 처리기의 세 줄 밖에 없습니다. 접근자는 불필요합니다 (신호를 좋은 설명이 포함 된 이름으로주고 다른 내장 신호처럼 사용하십시오).

일반적으로 필요하지 않은 슬롯 데코레이터를 제거 할 수 있습니다 (신호는 파이썬 호출 가능 모듈에 연결될 수 있으며 슬롯 일 필요는 없습니다).

이름 짓기 : 형식을 선택하고 모든 프로젝트에서 사용법을 고수하십시오. 예를 들어 : 편집기가 그런 종류의 지원이있는 경우이 같은

dataReceived = QtCore.Signal(object) 

    self.dataReceived.connect(self.handleDataReceived) 

    def handleDataReceived(self, data): 

보일러 플레이트 코드는 쉽게 템플릿을 통해 삽입 할 수 있습니다.

PS :

PyQt는에

, Connecting Slots By Name에 대한 지원이 - 내가 나 자신을 사용한 적이, 내가 그것도 PySide에서 지원 여부 모르겠지만, 당신이 유용 할 수 있습니다.

+0

클래스의 내부 작업을 외부 프로세스에 노출시키는 것이 좋지 않은 이유는 신호 방출을 숨기는 접근 방법을 사용하는 이유입니다. 다른 클래스는 이것이 신호이고 방출되어야한다는 것을 알지 못합니다. – pawel

+0

@pavel. 그것은 관용적 인 python이 아닙니다. 자바와 비슷하게 들립니다. 그러나 어떤 경우 든 다른 클래스가이 신호에 대해 알지 못하는 경우 왜 접근자를 제공합니까? 시그널을 클래스 내부에 넣고 싶다면, 일반적인 파이썬 관용구는 슬롯을 사용했을 때처럼 맨 앞줄로 이름을 짓는 것입니다. – ekhumoro

+0

신호가 내부에 들기를 원하지 않습니다. 내부 구조를 노출시키지 않고 인터페이스를 외부에서 제어 할 수 있기를 원합니다. 다른 클래스가 'emit'을 직접 호출하고 인터페이스를 신호를 사용하지 않고 'emit'이 아닌 다른 것으로 변경하면 많은 코드가 업데이트되어야합니다. 내 접근자를 사용하여 인터페이스가 외부 세계와 통신하는 방법을 제어하고 깨끗한 분리를 제공합니다. – pawel