有三个QTableViews
:A,B,C。所有三个共享相同的SourceModel。
有三个列名:"项目A","项目B"和"项目C"存储在self.columnNames
列表中。
为每个QTableView
分配了一个相同ProxyModel
的实例,其代理的objectName设置为" proxyA"," proxyB"和" proxyC"。
我希望左侧QTableView
仅列出项目" A"使用单个列,其标题名为"项目A"。
中间tableViewB
应该只列出" Items_B"列标题称为"项目B"。
第三个tableView应该只列出项目" C"列名设置为"项目C"。
源代码如下。我真的想知道怎么做。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items =[
['Item_A_0','Item_A_12','Item_C_330'],
['Item_C_20','Item_B_11','Item_B_12'],
['Item_C_101','Item_A_24','Item_B_77']
]
self.columnNames=['Items A', 'Items B', 'Items C']
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.columnNames[col]
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
def rowCount(self, parent):
return len(self.items)
def columnCount(self, parent):
return len(self.columnNames)
def data(self, index, role):
if not index.isValid(): return QVariant()
row=index.row()
column=index.column()
if row>len(self.items): return QVariant()
if column>len(self.items[row]): return QVariant()
columnName=self.headerData(column, Qt.Horizontal, Qt.DisplayRole)
if role == Qt.EditRole or role == Qt.DisplayRole:
return QVariant(self.items[row][column])
return QVariant()
def setData(self, index, value, role=Qt.EditRole):
if index.isValid():
if role == Qt.EditRole:
row = index.row()
column=index.column()
if row>len(self.items) or column>len(self.items[row]):
return False
else:
self.items[row][column]=value
return True
return False
class Proxy(QSortFilterProxyModel):
def __init__(self):
super(Proxy, self).__init__()
def filterAcceptsRow(self, row, parent):
sourceModel=self.sourceModel()
columns=sourceModel.columnCount(QModelIndex())
return True
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
tablemodel=Model(self)
proxyA=Proxy()
proxyA.setObjectName('proxyA')
proxyA.setSourceModel(tablemodel)
tableviewA=QTableView(self)
tableviewA.setModel(proxyA)
proxyB=Proxy()
proxyB.setObjectName('proxyB')
proxyB.setSourceModel(tablemodel)
tableviewB=QTableView(self)
tableviewB.setModel(proxyB)
proxyC=Proxy()
proxyC.setObjectName('proxyC')
proxyC.setSourceModel(tablemodel)
tableviewC=QTableView(self)
tableviewC.setModel(proxyC)
layout=QHBoxLayout(self)
layout.addWidget(tableviewA)
layout.addWidget(tableviewB)
layout.addWidget(tableviewC)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())