自动创建基于元组的QstackedWidget页面



我是Python的新手,我觉得这是一个先进的问题,考虑到这可能是堆栈交换的范围。请忍受我。

我有一个qtreewidget和qstackedwidget。我已经使用元组填充了Qtreewidget

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相对应的页面的qstackedwidget,并在同一环路中建立信号和插槽。我尝试使用:

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

但是所有对象都指向相同的十六进制值,我认为这意味着它们并非唯一。也许我需要增加索引?在任何一种情况下

这个想法是,只需将新类别或项目添加到元组中,qtreeview,qstackedwidget和信号/插槽都在运行时生成,而无需修改材料以外的任何源代码。

完成此操作的最佳方法是什么?

对不起,如果这太多了,但是我认为这可能是一个很好的问题,以防其他人在以后尝试同一件事。

编辑:我正在使用Python 3.6和Pyqt5

这个想法是将QStackedWidget的索引与QTreeWidgetItem关联,因此我们可以使用QTreeWidgetItemsetData()方法来保存索引,然后用data()方法恢复它:

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_())

相关内容

  • 没有找到相关文章

最新更新