2013-09-02 2 views
0

저는 PyQt를 배우고 있습니다. (전 C++ Qt를 사용하지 않았습니다).왜 신호와 슬롯이 PyQt에 있습니까?

신호 및 슬롯의 이유를 알 수 없습니다. 즉, 수업의 방법을 직접 호출하여 모든 것을 할 수있는 것 같습니다. 그렇게하는 것은 더 Pythonic하게 보이고 코드를 덜 사용하며 읽기가 더 쉽습니다. 내가 뭘 놓치고 있니? 내가 이렇게하는 이유에 대한 명확한

, 내가 부탁 해요 :

def mouseReleaseEvent(self): 
    self.clicksignal.connect(ui.iconClicked) 
    self.clicksignal.emit() 

나는이 작업을 수행 할 수있을 때 :

def mouseReleaseEvent(self): 
    ui.iconClicked() 

답변

5

GUI를 변경할 수 없기 때문에 신호와 슬롯이 존재하는 이유는 UI 스레드를 제외한 응용 프로그램의 다른 스레드로부터.

CPU 사용량이 많은 계산이나 IO를 기다리는 작업이있는 경우 ... UI 스레드를 수행하는 경우 (예 : URL을 가져 오거나 일정 기간) UI 스레드가 사용 중이며 GUI 이벤트 루프가 자체를 업데이트 할 수 없기 때문에 GUI가 고정 된 것처럼 보일 것입니다.

이러한 종류의 작업을 수행하려면. 별도의 (백그라운드 작업자) 스레드에서 실행하므로 UI ​​스레드는 GUI를 계속 업데이트 할 수 있습니다.

이제 GUI의 요소에 액세스 할 수없고 UI 스레드를 제외한 다른 스레드에서 상태를 변경할 수 없다는 점이 문제입니다. 따라서 신호와 슬롯이 도입되었습니다. 신호를 내 보내면 UI 스레드에서 신호가 잡히게되고 슬롯은 UI 스레드에서 실행됩니다.

귀하의 예에서 달성하고자하는 것이 정확히 무엇인지는 확실하지 않지만 이것이 신호와 슬롯이 존재하는 주된 이유입니다. 기본적으로 UI 스레드는 UI 만 처리해야하며 UI 스레드에서 잡히는 신호를 보내는 백그라운드 작업자 스레드와 UI 스레드에서 GUI를 업데이트하는 슬롯에서 실행해야하는 모든 작업을 수행해야합니다.

3

음 ... 가능합니다. 그러나 당신은 더 크게 생각할 필요가 있습니다. 예제 코드에서 mouseReleaseEvent의 호출자는 알림을받는 개체에 대한 참조가 있어야하며 명시 적으로 적절한 메서드를 호출해야합니다. 슬롯 &을 사용하여 신호 메커니즘은 이벤트 생성자 (예 : 위젯)를 이벤트 소비자로부터 분리합니다. 거의 모든 다른 임의의 객체입니다. 따라서 통신 및 제어 흐름을 하위 수준 UI 구성 요소보다 쉽고 외부에서 설정하는 것이 좋습니다. 또한 이러한 구성 요소를 재사용 할 수있게합니다. 배선 코드를 외부로 이동시켜 응용 프로그램 논리와 독립적으로 만듭니다.

3

@ViktorKerkez 및 @Wilbur의 답변 외에도 신호 및 슬롯은 화재 및 잊어 방지 시스템과 디커플링 클래스를 제공합니다.

큰 장점은 클래스가 신호를 내 보낼 수 있으며 메시지를 수신 할 대상 또는 누가 알지 못한다는 것입니다. 연결된 슬롯이 하나 인 객체 일 수도 있고 수십 개일 수도 있습니다. 또는 여러 개의 신호에 연결된 하나의 슬롯이있는 단일 클래스가 필요할 수 있습니다. 따라서 알림 시스템으로 사용할 수 있습니다.

예를 들어 많은 다른 유형의 객체가 정보를 로그에 보내는 프로그램을 상상해보십시오. 객체는 단순히 Log (텍스트) 신호를 내보내고 실제로 로깅을 수행하는 것에 신경을 쓰지 않습니다. 이러한 신호는 파일에 로깅, 네트워크, 화면 또는 한 번에 로깅 할 수있는 로그 클래스에 연결할 수 있습니다. 오브젝트 로깅은 상관하지 않습니다.