基于Tuple自动创建QStackedWidget页面
Automatically create QStackedWidget pages based on Tuple
我是 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
的索引关联到QTreeWidgetItem
,所以我们可以使用QTreeWidgetItem
的setData()
方法来保存索引,并且然后使用 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_())
我是 python 的新手,我觉得这是一个高级问题,考虑到这一点,它可能超出了 Stack Exchange 的范围。请多多包涵。
我有一个 QTreeWidget 和 QStackedWidget。我已经使用元组
填充了 QTreeWidgetTreeList = ({
'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
的索引关联到QTreeWidgetItem
,所以我们可以使用QTreeWidgetItem
的setData()
方法来保存索引,并且然后使用 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_())