首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于元组自动创建QStackedWidget页面

基于元组自动创建QStackedWidget页面
EN

Stack Overflow用户
提问于 2017-12-01 19:46:26
回答 1查看 169关注 0票数 0

我对python相当陌生,我觉得这是一个高级问题,考虑到这一点,它可能超出了Stack Exchange的范围。请容忍我。

我有QTreeWidget和QStackedWidget。我已经使用tuple填充了QTreeWidget

代码语言:javascript
复制
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]))

我想使用相同的元组来填充与QStackedWidget对应的页面,并在相同的循环中建立信号和插槽。我试过使用:

代码语言:javascript
复制
for key in TreeList['Item1']:
    page = QWidget()
    page.setObjectName(key)
    self.QStackedWidget.addWidget(page)
    print(self.QStackedWidget)

但是所有的对象都指向相同的十六进制值,这意味着它们并不是唯一的。也许我需要增加索引?在这两种情况下,我都无法弄清楚如何在执行此操作时生成信号和时隙,因为它们是动态创建的,我需要唯一但可预测的名称。

其思想是,通过简单地向元组添加一个新的类别或项,QTreeView、QStackedWidget和信号/槽都是在运行时生成的,而不必修改元组以外的任何源代码。

实现这一目标的最佳方法是什么?

对不起,如果这是太多,但我想这可能是一个很好的问题,以防其他人尝试相同的事情在以后的时间。

编辑:我使用Python3.6和PyQt5

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-01 20:08:45

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

代码语言:javascript
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47600467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档