2017-12-01 3 views
0

저는 파이썬에 처음으로 익숙합니다.이 질문은 스택 교환의 범위를 벗어날 수 있다는 점을 염두에두고 고급 질문이라고 생각합니다. 나와 함께 견뎌주세요.터플을 기반으로 QStackedWidget 페이지를 자동으로 생성합니다.

저는 QTreeWidget과 QStackedWidget을 가지고 있습니다. 나는 튜플 나는 QTreeWidget에 해당 동일한 루프와 신호와 슬롯을 설정 페이지와 QStackedWidget을 채우기 위해이 같은 튜플을 사용하고자하는

TreeList = ({ 

    'Header1': ((
     'Item11', 
     'Item12', 
    )), 

    'Header2': ((
     'Item21', 
     'Item22' 
    )) 
}) 

for key, value in TreeList.items(): 
    root = QTreeWidgetItem(self.QTreeWidget, [key]) 
    for val in value: 
     root.addChild(QTreeWidgetItem([val])) 

를 사용하여 QTreeWidget을 채워왔다. 나는 다음을 사용하여 시도했다 :

for key in TreeList['Item1']: 
    page = QWidget() 
    page.setObjectName(key) 
    self.QStackedWidget.addWidget(page) 
    print(self.QStackedWidget) 

그러나 모든 객체는 동일한 헥사 값을 가리킨다. 아마도 색인을 증가시켜야합니까? 두 경우 모두 동적으로 생성되고 고유하지만 예측 가능한 이름이 필요하기 때문에 신호와 슬롯을 생성하는 방법을 파악할 수 없었습니다.

튜플에 새로운 카테고리 나 아이템을 추가하기 만하면 튜토리얼 밖의 소스 코드를 수정할 필요없이 런타임에 QTreeView, QStackedWidget 및 신호/슬롯이 모두 생성된다는 아이디어가 있습니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

죄송합니다. 너무 많으면 다른 사람이 나중에 동일한 시도를 시도 할 때 좋은 질문 일 수 있습니다.

편집 : 파이썬 3.6 PyQt5

아이디어가 QTreeWidgetItem으로 QStackedWidget의 인덱스를 연결하는 것입니다
+0

하고 QTreeWidget 항목, 즉, 어떤 신호 연결하려는 수행하십시오 data() 방법? – eyllanesc

+0

페이지 탐색에 QTreeWidget을 사용하고 싶습니다. 헤더에는 아무런 연결이 없습니다. –

답변

1

을 사용하고, 그래서 우리는 색인을 저장 QTreeWidgetItemsetData() 방법을 사용하고 복구 할 수 있습니다

import sys 

from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 

class Widget(QWidget): 
    def __init__(self, *args, **kwargs): 
     QWidget.__init__(self, *args, **kwargs) 
     self.tree = QTreeWidget(self) 
     self.stack = QStackedWidget(self) 
     lay = QHBoxLayout(self) 
     lay.addWidget(self.tree) 
     lay.addWidget(self.stack) 

     for key, value in TreeList.items(): 
      root = QTreeWidgetItem(self.tree, [key]) 
      for val in value: 
       item = QTreeWidgetItem([val]) 
       root.addChild(item) 
       widget = QLabel(val, self) 
       ix = self.stack.addWidget(widget) 
       item.setData(0, Qt.UserRole, ix) 
     self.tree.expandAll() 
     self.tree.itemClicked.connect(self.onItemClicked) 

    def onItemClicked(self, item, column): 
     val = item.data(0, Qt.UserRole) 
     if val is not None: 
      self.stack.setCurrentIndex(val) 

TreeList = ({ 

    'Header1': ((
     'Item11', 
     'Item12', 
    )), 

    'Header2': ((
     'Item21', 
     'Item22' 
    )) 
}) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Widget() 
    w.show() 
    sys.exit(app.exec_()) 
QStackedWidget 페이지가 있어야한다 어떤 관계
+0

나는 시험 할 기회가 없었으므로, 나는 집에 도착하자마자 나는 일할 것이다. 소스의 다른 영역에서 페이지 중 하나를 참조해야하는 경우이를 수행하는 가장 좋은 방법은 무엇입니까? 예를 들어 self.stack은 QStackedWidget을 참조하지만,이 예제에서는 item11이 필요합니다. 색인이 무엇인지 반드시 알 필요는 없습니다. 이것이 초등 질문 인 경우 죄송합니다. 나는 당신의 대답으로 일할 시간이 없었습니다. 여기를 통해 직접 연락 할 수있는 곳이 있습니까? –

+0

마지막으로 이것을 시험해 볼 기회를 얻었습니다. 예상대로 그것은 완벽하게 작동하지만, 내 독특한 상황을 감안할 때, 내가 어떻게 접근하고 있는지 다시 생각해 볼 필요가있다. –

관련 문제