python - 如何使用模型/ View 将 2 个表格小部件(每个表格小部件 1 列)组合成一个列表小部件

标签 python python-3.x pyqt5

我想连接 tablewidget_1 中的列项目和 tablewidget_2 中的列项目,并将结果放入 listwidget ListView 。我正在使用pyqt5。我知道如何将模型设置为表的特定列,然后将该模型影响到 ListView ,但我没有找到如何将 2 个 tablewidgets 连接到模型中的方法。

这里是仅一个表格小部件的模型代码:

model = QtCore.QSortFilterProxyModel()
model.setSourceModel(self.tableWidget.model())

listview.setModel(model)
listview.setModelColumn(0)

最佳答案

第一个是使用自定义 QAbstractProxyModel 将表类型模型转换为列表类型,然后使用 QConcatenateTablesProxyModel 连接它(PyQt5>=5.13):

from PyQt5 import QtCore, QtGui, QtWidgets


class Table2ListProxyModel(QtCore.QIdentityProxyModel):
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 0 if self.sourceModel() is None else 1

    def rowCount(self, parent=QtCore.QModelIndex()):
        if self.sourceModel() is None:
            return 0
        return self.sourceModel().rowCount() * self.sourceModel().columnCount()

    def index(self, row, column, parent=QtCore.QModelIndex()):
        if row < 0 or column < 0 or self.sourceModel() is None:
            return QtCore.QModelIndex()
        source_parent = self.mapToSource(parent)
        r = row // self.sourceModel().columnCount()
        c = row % self.sourceModel().columnCount()
        sourceIndex = self.sourceModel().index(r, c, source_parent)
        return self.mapFromSource(sourceIndex)

    def mapToSource(self, proxyIndex):
        if self.sourceModel() is None or not proxyIndex.isValid():
            return QtCore.QModelIndex()
        r = proxyIndex.row() // self.sourceModel().columnCount()
        c = proxyIndex.row() % self.sourceModel().columnCount()
        return self.sourceModel().index(r, c)

    def mapFromSource(self, sourceIndex):
        if self.sourceModel() is None or not sourceIndex.isValid():
            return QtCore.QModelIndex()
        r = sourceIndex.row() * self.sourceModel().columnCount() + sourceIndex.column()
        c = 0
        return self.createIndex(r, c, sourceIndex.internalPointer())


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self._table1 = QtWidgets.QTableWidget(3, 2)
        self._table2 = QtWidgets.QTableWidget(4, 3)
        self._table3 = QtWidgets.QTableWidget(5, 4)
        self._table4 = QtWidgets.QTableWidget(6, 5)

        tables = (self._table1, self._table2, self._table3, self._table4)

        for i, table in enumerate(tables):
            for row in range(table.rowCount()):
                for column in range(table.columnCount()):
                    it = QtWidgets.QTableWidgetItem("{}: {}-{}".format(i, row, column))
                    table.setItem(row, column, it)

        concatenate_proxy_model = QtCore.QConcatenateTablesProxyModel(self)
        concatenate_list_view = QtWidgets.QListView()
        concatenate_list_view.setModel(concatenate_proxy_model)

        grid_layout = QtWidgets.QGridLayout(self)
        grid_layout.addWidget(QtWidgets.QLabel("Table to List:"), 1, 0, 1, len(tables))
        grid_layout.addWidget(QtWidgets.QLabel("Results:"), 3, 0, 1, len(tables))
        grid_layout.addWidget(concatenate_list_view, 4, 0, 1, len(tables))

        for i, table in enumerate(tables):
            list_view = QtWidgets.QListView()
            proxy = Table2ListProxyModel(self)
            proxy.setSourceModel(table.model())
            list_view.setModel(proxy)
            concatenate_proxy_model.addSourceModel(proxy)

            grid_layout.addWidget(table, 0, i)
            grid_layout.addWidget(list_view, 2, i)

        self.resize(640, 480)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

关于python - 如何使用模型/ View 将 2 个表格小部件(每个表格小部件 1 列)组合成一个列表小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57378330/

相关文章:

Python MySql Select 语句。来自Python 条目的Where 列

python - 用于读取输入的 StdIn 黑客排名挑战

python - QWidget 类型的包装的 c/c++ 对象已被删除

javascript - JQuery-Django If 语句不起作用

python - 在没有 slim.learning.train() 的情况下使用 Tensorflow TF-Slim

python - 在执行操作的单独子数组中获取 numpy 子数组的结果,而不使用 for 循环

python - 使用 WinPython 时,Python 中出现大量素数列表时出现意外的 sum(list) 行为

python - 如何在python pyqt5中连续更改标签颜色颜色

python - 如何在 PyQt5 中单击按钮时从表格中删除复选框?

python - Pandas loc 错误 : 'Series' objects are mutable, 因此它们不能被散列