PySide2 QListView QTableView同步问题
PySide2 QListView QTableView sync problem
这是python/PySide2界面相关的问题,我试了很多次,还是无法同步(QListView和QTableView)。
我会尽量简化它,而不是解释整个复杂的事情,它在 QT 中充满了各种形式的东西……
想象一下有一个如下所示的数据结构(我猜是模型):
dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}
我想要一个表单(或对话框),包含 2 个部分:
1) 在窗体的左侧,有一个QListView 可视化如下:
*dict1
------
dict2
-----
dict3
备注:
dict1 中的星号表示已 selected.
连字符只是用于分隔行。
2) 在窗体的右边,有一个QTableView显示如下:
k1 | v1
-------
k2 | v2
-------
k3 | v3
备注:
连字符只是用于分隔行。
管道,只是代表列的分隔。
每次您select QListView 中的另一个元素时,QTableView 必须更改为原始数据结构所指示的那个。
我相信这对你们大多数人来说真的很容易,但我只是从 UI 东西和 MVC 开始。
您必须创建一个具有树结构的模型,其中可以看到依赖项,对于 QListView 它将显示根项,对于 QTableView 它将显示叶子并且它将具有作为 rootIndex,QListView 的选定 QModelIndex。出于教育目的,我将在 QTreeView 中显示树的模型。
from PySide2 import QtCore, QtGui, QtWidgets
dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}
def create_model_from_dict(d, parent=None):
model = QtGui.QStandardItemModel(0, 2, parent)
for k, v in dict_of_dicts.items():
it = QtGui.QStandardItem(k)
model.appendRow(it)
for k_, v_ in v.items():
it.appendRow([QtGui.QStandardItem(k_), QtGui.QStandardItem(v_)])
return model
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
model = create_model_from_dict(dict_of_dicts, self)
self.tableview = QtWidgets.QTableView()
self.tableview.setModel(model)
self.listview = QtWidgets.QListView()
self.listview.setModel(model)
self.listview.selectionModel().selectionChanged.connect(self.handleSelectionChanged)
self.listview.selectionModel().select(model.index(0, 0), QtCore.QItemSelectionModel.Select)
self.treeview = QtWidgets.QTreeView()
self.treeview.setModel(model)
self.treeview.expandAll()
hlay = QtWidgets.QHBoxLayout(self)
hlay.addWidget(self.listview)
hlay.addWidget(self.tableview)
hlay.addWidget(self.treeview)
@QtCore.Slot(QtCore.QItemSelection)
def handleSelectionChanged(self, item):
ixs = item.indexes()
if ixs:
self.tableview.setRootIndex(ixs[0])
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
这是python/PySide2界面相关的问题,我试了很多次,还是无法同步(QListView和QTableView)。
我会尽量简化它,而不是解释整个复杂的事情,它在 QT 中充满了各种形式的东西……
想象一下有一个如下所示的数据结构(我猜是模型):
dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}
我想要一个表单(或对话框),包含 2 个部分:
1) 在窗体的左侧,有一个QListView 可视化如下:
*dict1
------
dict2
-----
dict3
备注:
dict1 中的星号表示已 selected.
连字符只是用于分隔行。
2) 在窗体的右边,有一个QTableView显示如下:
k1 | v1
-------
k2 | v2
-------
k3 | v3
备注:
连字符只是用于分隔行。
管道,只是代表列的分隔。
每次您select QListView 中的另一个元素时,QTableView 必须更改为原始数据结构所指示的那个。
我相信这对你们大多数人来说真的很容易,但我只是从 UI 东西和 MVC 开始。
您必须创建一个具有树结构的模型,其中可以看到依赖项,对于 QListView 它将显示根项,对于 QTableView 它将显示叶子并且它将具有作为 rootIndex,QListView 的选定 QModelIndex。出于教育目的,我将在 QTreeView 中显示树的模型。
from PySide2 import QtCore, QtGui, QtWidgets
dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6', 'k7':'v7'},
}
def create_model_from_dict(d, parent=None):
model = QtGui.QStandardItemModel(0, 2, parent)
for k, v in dict_of_dicts.items():
it = QtGui.QStandardItem(k)
model.appendRow(it)
for k_, v_ in v.items():
it.appendRow([QtGui.QStandardItem(k_), QtGui.QStandardItem(v_)])
return model
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
model = create_model_from_dict(dict_of_dicts, self)
self.tableview = QtWidgets.QTableView()
self.tableview.setModel(model)
self.listview = QtWidgets.QListView()
self.listview.setModel(model)
self.listview.selectionModel().selectionChanged.connect(self.handleSelectionChanged)
self.listview.selectionModel().select(model.index(0, 0), QtCore.QItemSelectionModel.Select)
self.treeview = QtWidgets.QTreeView()
self.treeview.setModel(model)
self.treeview.expandAll()
hlay = QtWidgets.QHBoxLayout(self)
hlay.addWidget(self.listview)
hlay.addWidget(self.tableview)
hlay.addWidget(self.treeview)
@QtCore.Slot(QtCore.QItemSelection)
def handleSelectionChanged(self, item):
ixs = item.indexes()
if ixs:
self.tableview.setRootIndex(ixs[0])
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())