一种模型,两种不同的视图 - PySide
One Model, two different views - PySide
我有 QAbstractTable具有 4 列的模型。
我试图在视图 (QTableView) 上显示前 3 列,当在此类视图上选择一行时,第二个视图 (QListView) 应该显示第 4 列该模型。
我发现了一些关于 QProxyModel 的信息,但我很难全神贯注于它。还有一个 'solutions' 我发现了类似的东西 HERE 但不知何故我想要相反的结果。
我要显示的数据是这样的:[['green'、'car'、'available'、['a'、'b' ,'c','d']]]
因此,在 Table 视图中它会显示:绿色 - 汽车 - 可用。
当点击这样的行时,列表视图将在最后一个位置显示数组:a - b - c - d.
我希望这是有道理的。
有关指导、文档、示例的提示?
感谢您的宝贵时间。
对于这种特殊情况,使用代理模型是不合适的,每次点击应该做的是获取QModelIndex
,通过QModelIndex
我们获取模型和行按下以便在最后我们获得保存的列表,我们可以将此列表作为源传递给模型 QStringListModel
,我们将在 QListView
中建立它。要隐藏该列,我们使用 QTableView
的 hideColumn()
。
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class TableModel(QAbstractTableModel):
def __init__(self, *args, **kwargs):
QAbstractTableModel.__init__(self, *args, **kwargs)
self.values = [['green', 'car', 'available', ['a', 'b', 'c', 'd']],
['red', 'airplane', 'available', ['b', 'c', 'd', 'e']],
['yellow', 'boat', 'not available', ['c', 'd', 'e', 'f']]]
def columnCount(self, parent=QModelIndex()):
return 4
def rowCount(self, parent=QModelIndex()):
return len(self.values)
def data(self, index, role=Qt.DisplayRole):
if 0 <= index.row() < self.rowCount() and 0 <= index.column() < self.columnCount():
if role == Qt.DisplayRole:
return self.values[index.row()][index.column()]
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
splitter = QSplitter()
self.tv = QTableView()
self.lv = QListView()
self.setLayout(QHBoxLayout())
splitter.addWidget(self.tv)
splitter.addWidget(self.lv)
self.layout().addWidget(splitter)
model = TableModel()
self.tv.setModel(model)
self.tv.hideColumn(3)
self.tv.clicked.connect(self.on_clicked)
def on_clicked(self, ix):
model = ix.model()
m_list = model.index(ix.row(), 3).data()
self.lv.setModel(QStringListModel(m_list))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
我有 QAbstractTable具有 4 列的模型。
我试图在视图 (QTableView) 上显示前 3 列,当在此类视图上选择一行时,第二个视图 (QListView) 应该显示第 4 列该模型。
我发现了一些关于 QProxyModel 的信息,但我很难全神贯注于它。还有一个 'solutions' 我发现了类似的东西 HERE 但不知何故我想要相反的结果。
我要显示的数据是这样的:[['green'、'car'、'available'、['a'、'b' ,'c','d']]]
因此,在 Table 视图中它会显示:绿色 - 汽车 - 可用。 当点击这样的行时,列表视图将在最后一个位置显示数组:a - b - c - d.
我希望这是有道理的。
有关指导、文档、示例的提示?
感谢您的宝贵时间。
对于这种特殊情况,使用代理模型是不合适的,每次点击应该做的是获取QModelIndex
,通过QModelIndex
我们获取模型和行按下以便在最后我们获得保存的列表,我们可以将此列表作为源传递给模型 QStringListModel
,我们将在 QListView
中建立它。要隐藏该列,我们使用 QTableView
的 hideColumn()
。
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class TableModel(QAbstractTableModel):
def __init__(self, *args, **kwargs):
QAbstractTableModel.__init__(self, *args, **kwargs)
self.values = [['green', 'car', 'available', ['a', 'b', 'c', 'd']],
['red', 'airplane', 'available', ['b', 'c', 'd', 'e']],
['yellow', 'boat', 'not available', ['c', 'd', 'e', 'f']]]
def columnCount(self, parent=QModelIndex()):
return 4
def rowCount(self, parent=QModelIndex()):
return len(self.values)
def data(self, index, role=Qt.DisplayRole):
if 0 <= index.row() < self.rowCount() and 0 <= index.column() < self.columnCount():
if role == Qt.DisplayRole:
return self.values[index.row()][index.column()]
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
splitter = QSplitter()
self.tv = QTableView()
self.lv = QListView()
self.setLayout(QHBoxLayout())
splitter.addWidget(self.tv)
splitter.addWidget(self.lv)
self.layout().addWidget(splitter)
model = TableModel()
self.tv.setModel(model)
self.tv.hideColumn(3)
self.tv.clicked.connect(self.on_clicked)
def on_clicked(self, ix):
model = ix.model()
m_list = model.index(ix.row(), 3).data()
self.lv.setModel(QStringListModel(m_list))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())