2017-12-07 16 views
2

나는 많은 위젯과 다른 윈도우 등으로 PyQt에 프로그래밍 된 GUI를 가지고있다. GUI 용 데이터는 파이썬 객체에 저장된다. 이 객체는 프로그램의 모든 위젯에서 접근 할 수 있어야합니다. 이 물체를 어디에 두어야합니까?PyQt 애플리케이션에서 공통 데이터 객체에 액세스하기

지금 당장은 프로그램의 기본 창에 사용되는 QMainWindow 인스턴스에 있습니다. 문제는 깊게 중첩 된 위젯에서 QMainWindow 객체에 도달하는 것이 어렵다는 것입니다. QtCore.QCoreApplication.instance() (이 answer과 같이)를 사용하면 QApplication 인스턴스를 사용하는 것이 훨씬 간단 해 보입니다. 그러나 QApplication 클래스를 변경하도록 권장하는 다른 예제를 찾을 수 없으므로 실제로 그렇게 사용해야하는지 궁금합니다.

어떤 접근 방식을 제안 하시겠습니까?

+1

간단한 GUI의 경우 QMainWindow 내에 데이터를 저장하면 충분합니다 ('QWidget.window() '를 통해 액세스). 대부분의 프로그램은 하나의 기본 창과 일부 대화 상자 (기본 창에 대한 참조가 부모 인 것처럼)가 있기 때문에 더 많은 예제를 찾을 수없는 이유를 설명 할 수 있습니다. 또 다른 접근법은'QSettings'을 사용하는 것이지만, 실제 프로그램 설정을 저장해야하는 경우에는 좋은 해결책이 될 수 없습니다. 'QCoreApplication.instance' 시스템을 고수 할 것입니다. – musicamante

답변

1

올바른 방법은이 데이터/설정 개체를 별도의 모듈에 저장하는 것입니다. 필요한 경우 어디서나 간단하게 가져올 수 있습니다. 이상적으로, 모듈 (및 데이터/설정 객체를 생성하는 코드)은 나머지 응용 프로그램과 크게 독립적이어야합니다.

어쨌든 QApplication 또는 qApp 중 하나를 가져와야하기 때문에 데이터/설정 개체를 응용 프로그램 인스턴스에 묶는 것은 실제 가치가 없습니다. 그리고 동일한 문제가 QMainWindow에도 적용됩니다. 문제를 다른 위치로 옮기고 불필요한 간접 참조를 추가합니다. 이 접근법의 또 다른 큰 문제점은 응용 프로그램 또는 기본 창의 인스턴스가 사용 가능해질 때까지 데이터/설정 객체에 액세스 할 수 없다는 것입니다. 데이터/설정 객체는 응용 프로그램의 여러 부분을 초기화하는 동안 필요할 수 있으므로 특정 GUI 요소에 연결하면 순환 종속성 또는 기타 주문 문제가 발생할 수 있습니다.

핵심 설계 원리는 Loose Coupling입니다. 일단 GUI에서 데이터/설정 객체를 분리하면 나머지 응용 프로그램이 필요할 때마다 언제든지 액세스 할 수 있습니다.