发布的代码创建了一个Model/Proxy
QTableView
. 已为其启用了多选功能。
总共有四个项目。其中两个包括字符“A”。其他两个在其“项目”名称中包含字符“B”。
QPushButton
按下时调用该clicked()
方法。调用此方法时,首先查询Proxy Model
连接到QTableView
:
proxyModel=self.tableview.model()
然后该方法要求 aproxyModel
返回总行数:
rows=proxyModel.rowCount()
知道 a 的模型中有多少行,QTabelView
它会迭代每一行。首先它是查询一个行索引:
index=proxyModel.index(row, 0)
知道它继续通过调用方法index
来请求存储在变量中的值,并为它提供上一步中查询的 a (这里是变量)和标志。self.items
data()
QModelIndex
index
Role
item=proxyModel.data(index, Qt.DisplayRole).toPyObject()
'toPyObject()' 用于将从.data()
方法接收到的数据转换为“常规”Python 变量。
最后它检查接收到的字符串中是否有字符“ B ”。如果是这样,它使用以下命令选择 QTableView 行:
self.tableview.selectRow(row)
现在我想要的是从代理模型的范围内获得相同的选择功能,filterAcceptsRow()
如果可能的话。
如果不可能,我想知道是否有其他方法可以做到这一点……我应该使用QItemSelectionModel
吗?那怎么办?
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_A_001','Item_A_002','Item_B_001','Item_B_002']
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()
elif role != Qt.DisplayRole:
return QVariant()
row=index.row()
if row<len(self.items):
return QVariant(self.items[row])
else:
return QVariant()
class Proxy(QSortFilterProxyModel):
def __init__(self):
super(Proxy, self).__init__()
def filterAcceptsRow(self, row, parent):
return True
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
tableModel=Model(self)
proxyModel=Proxy()
proxyModel.setSourceModel(tableModel)
self.tableview=QTableView(self)
self.tableview.setModel(proxyModel)
self.tableview.horizontalHeader().setStretchLastSection(True)
self.tableview.setSelectionMode(QAbstractItemView.MultiSelection)
button=QPushButton(self)
button.setText('Select Items with B')
button.clicked.connect(self.clicked)
layout = QVBoxLayout(self)
layout.addWidget(self.tableview)
layout.addWidget(button)
self.setLayout(layout)
def clicked(self, arg):
proxyModel=self.tableview.model()
self.tableview.clearSelection()
rows=proxyModel.rowCount()
for row in range(rows):
index=proxyModel.index(row, 0)
item=proxyModel.data(index, Qt.DisplayRole).toPyObject()
if '_B_' in item:
self.tableview.selectRow(row)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())