投稿されたコードは、singe を作成しますModel/Proxy
QTableView
。複数選択機能が有効になっています。
全部で4つのアイテムがあります。そのうちの 2 つは文字「A」を含みます。他の 2 つは、「アイテム」名に文字「B」が含まれています。
QPushButton
押されたときにclicked()
メソッドが呼び出されます。このメソッドが呼び出されると、最初に にProxy Model
接続された を照会しQTableView
ます。
proxyModel=self.tableview.model()
次に、メソッドはproxyModel
行の総数を返すように a に要求します。
rows=proxyModel.rowCount()
QTabelView
各行を反復する のモデル内の行数を知る。まず、行インデックスをクエリしています。
index=proxyModel.index(row, 0)
それを知ると、前のステップで照会された a (ここでは変数) とフラグを提供するメソッドを呼び出して、変数にindex
格納されている値を要求することになります。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_())