我想连接 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/