如果您想获得基于另一个模型的新模型,那么您可以使用 QXProxyModel。在您的特定情况下,您可以使用以下过程转换模型:
- 使用 QTransposeProxyModel 旋转表格。
- 使用 hideRow() 隐藏行。
- 通过实现基于 QIdentityProxyModel 的代理来映射标头。
from PyQt5 import QtCore, QtGui, QtWidgets
class CustomProxyModel(QtCore.QIdentityProxyModel):
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return self.sourceModel().index(0, section).data(role)
else:
return 1
return super().headerData(section, orientation, role)
def setSourceModel(self, model):
super().setSourceModel(model)
model.dataChanged.connect(self._on_headerDataChanged)
def _on_headerDataChanged(self, topLeft, bottomRight, roles):
if topLeft.row() <= 0 <= bottomRight.row():
self.headerDataChanged.emit(
QtCore.Qt.Horizontal, topLeft.row(), bottomRight.row()
)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
model = QtGui.QStandardItemModel(3, 4)
datas = (
("Element 1", "2", "3", "4"),
("Another element", "6", "7", "8"),
("Element nr. 3", "10", "11", "12"),
)
for i, r in enumerate(datas):
for j, d in enumerate(r):
it = QtGui.QStandardItem(d)
model.setItem(i, j, it)
proxy = QtCore.QTransposeProxyModel()
proxy.setSourceModel(model)
proxy2 = CustomProxyModel()
proxy2.setSourceModel(proxy)
view1 = QtWidgets.QTableView()
view1.setModel(model)
view2 = QtWidgets.QTableView()
view2.setModel(proxy2)
for r in range(proxy.rowCount()):
if r != 2:
view2.hideRow(r)
w = QtWidgets.QWidget()
lay = QtWidgets.QHBoxLayout(w)
lay.addWidget(view1)
lay.addWidget(view2)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())