如何使用model/vi将2个tablewidget(每一个一列)组合成一个listwidget

2024-09-25 14:28:13 发布

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

我想连接tablewidget_1中一列的项和tablewidget_2中一列的项,并将结果放入listwidgetlistview。我用的是pyqt5。我知道如何将模型设置为表的特定列,然后将此模型影响到listview,但我没有找到如何将2tablewidgets连接到模型中的方法。你知道吗

以下是一个tablewidget的模型代码:

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

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

Tags: 方法代码模型selfmodelpyqt5listviewqtcore
1条回答
网友
1楼 · 发布于 2024-09-25 14:28:13

第一种方法是使用自定义^{}将表类型模型转换为列表类型,然后使用^{}(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_())

相关问题 更多 >