【问题标题】:Automatically create QStackedWidget pages based on Tuple基于 Tuple 自动创建 QStackedWidget 页面
【发布时间】:2017-12-01 19:46:26
【问题描述】:

我对 python 还很陌生,我觉得这是一个高级问题,考虑到它可能超出了 Stack Exchange 的范围。请多多包涵。

我有一个 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]))

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

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

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

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

最好的方法是什么?

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

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

【问题讨论】:

  • QStackedWidget页面应该和QTreeWidget项有什么关系,也就是要连接什么信号?
  • 我想使用 QTreeWidget 进行页面导航。标头不会有任何连接。

标签: python pyqt5 qt-signals qstackedwidget qt-slot


【解决方案1】:

思路是将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_())

【讨论】:

  • 我还没有机会测试,我回家后会。如果我需要从源中的不同区域引用其中一个页面,那么最好的方法是什么?例如 self.stack 引用了 QStackedWidget,但在这个例子中我需要 item11,我不一定知道它的索引是什么。对不起,如果这是一个基本问题。我没有时间处理你的答案。说到这里可以直接联系你吗?
  • 终于有机会测试了。正如预期的那样,它完美无缺,但鉴于我的独特情况,我需要重新考虑我是如何处理这个问题的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2021-05-03
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多