一个模型,两个不同的视图PySid

2024-09-30 00:39:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有4列的QAbstractTableModel。在

我试图在视图(QTableView)上显示前3列,当在这样的视图上选择一行时,第二个视图(QListView)应该显示模型的第4列。在

我发现了一些关于QProxyModel的东西,但我很难集中精力。还有一个'解决方案',我发现了一些类似的东西HERE,但不知何故我想要的是相反的结果。在

我要显示的数据是这样的:[['green','car','available',['a','b','c','d']]]

因此,在表视图中,它将显示:green-car-available。 当单击这样的行时,列表视图将在最后一个位置显示数组:a-b-c-d

我希望这有道理。在

关于方向、文档、示例的提示?在

谢谢你抽出时间。在


Tags: 数据模型视图列表heregreen解决方案car
1条回答
网友
1楼 · 发布于 2024-09-30 00:39:42

对于这种特殊情况,使用代理模型是不合适的,每次单击时应该做的是获得QModelIndex,通过QModelIndex我们获得模型并按下行,以便在最后获得保存的列表,此列表可以作为源传递给模型QStringListModel,我们将在QListView中建立它。为了隐藏列,我们使用QTableViewhideColumn()。在

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_())

相关问题 更多 >

    热门问题