有两个tableViews
:A和B. viewA
与proxyA
相关联。 viewB
与proxyB
相关联。两个代理共享相同的source model
。
根据我所了解的if Qt.CheckStateRole
,source model
data()
为每个modelIndex
分配了一个复选框。
由于此checkbox-to-modelIndex assignment
发生在sourceModel
内部,因此A和B都获得了checkboxes
。
问题:如何将viewA
与checkboxes
隔离开来?如何使viewA
无复选框?目标是确保复选框仅显示在viewB
中。是否可以覆盖某些viewA
属性,因此它不会显示复选框?可能我可以使用viewB
代理并从代理'filterAcceptsRow()做一些调用吗?
问题显然是sourceModel
不了解观点。它不关心是否为viewA
或B
查询索引。使用代理模型时,我可以设置proxyA.setObjectName('proxyA')
,然后使用其objectName
做一些逻辑。但是如何从Proxy内部控制checkboxes
呢?....
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items = ['Item_003','Item_000','Item_005','Item_004','Item_001']
def rowCount(self, parent=QModelIndex()):
return len(self.items)
def columnCount(self, parent=QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid(): return QVariant()
row=index.row()
if role == Qt.DisplayRole:
return QVariant(self.items[row])
elif role == Qt.CheckStateRole:
return QVariant(Qt.Checked)
else:
return QVariant()
class Proxy(QSortFilterProxyModel):
def __init__(self):
super(Proxy, self).__init__()
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
layout=QHBoxLayout(self)
self.setLayout(layout)
tableModel=Model(self)
proxyA=Proxy()
proxyA.setSourceModel(tableModel)
proxyB=Proxy()
proxyB.setSourceModel(tableModel)
self.ViewA=QTableView(self)
self.ViewA.setModel(proxyA)
self.ViewB=QTableView(self)
self.ViewB.setModel(proxyB)
layout.addWidget(self.ViewA)
layout.addWidget(self.ViewB)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())