2017-12-01 35 views
0

私はPythonには新しく、これは高度な質問だと思いますが、Stack Exchangeの範囲外である可能性があります。私と一緒に抱きしめてください。タプルに基づいて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、およびシグナル/スロットはすべて、実行時にタプルを超えてソースコードを変更することなく生成されるという考えがあります。

これを達成するにはどうすればよいでしょうか?

申し訳ありませんこれはあまりにも大きければ、誰かが後で同じことを試みる場合には良い質問かもしれないと思いました。

編集:私は、Python 3.6とPyQt5

アイデアは QTreeWidgetItemQStackedWidgetのインデックスを関連付けることである
+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

私はテストするチャンスがなかった、私はかつて私は家に帰るだろう。ソースの別の領域のページの1つを参照する必要がある場合は、それを達成する最も良い方法は何でしょうか?例えばself.stackはQStackedWidgetを参照していますが、この例ではitem11が必要ですが、インデックスが何であるかは必ずしも分かりません。これが基本的な質問であれば申し訳ありません。私はあなたの答えに取り組む時間がなかった。ここから直接あなたに連絡する方法はありますか? –

+0

最後にこれをテストする機会を得ました。予想どおり、完璧に動作しますが、私のユニークな状況を考えれば、私はこれにどのように近づいているのか再考する必要があります。 –