如何使用 selectionModel 在 QTableView 中 select 多行

How to select multiple rows in QTableView using selectionModel

与:

tableView = QTableView()
rows = [0, 1, 2]

tableView.selectRow(0)tableView.selectRow(2) 在这种情况下不起作用,因为 selectRow() 只选择单行,取消选择所有其他行。

selectionModel().select() 方法可用。但它接受 QSelectionItems 对象作为参数。我们如何声明具有行号的 QSelectionItem 对象?

您应该设置选择模式。

tableView->setSelectionMode(QAbstractItemView::MultiSelection);

代码创建 QTableViewQPushButton。按下按钮 select 连续排序索引(从 index1index2。是否可以按任何顺序 select 索引仍然是一个未回答的问题.

def clicked():
    tableView.setFocus()
    selectionModel = tableView.selectionModel()
    index1 = tableView.model().index(0, 0)
    index2 = tableView.model().index(1, 2)
    itemSelection = QtGui.QItemSelection(index1, index2)
    selectionModel.select(itemSelection, QtGui.QItemSelectionModel.Rows | QtGui.QItemSelectionModel.Select)

app = QtGui.QApplication([])
window = QtGui.QWidget()
window.resize(400, 300)
tableView = QtGui.QTableView()

model = QtGui.QStandardItemModel(4, 2)
for row in range(0, 4):
    for column in range(0, 3):
        item = QtGui.QStandardItem("%s , %s"%(row, column))
        model.setItem(row, column, item)

tableView.setModel(model)

selectionModel = QtGui.QItemSelectionModel(model)
tableView.setSelectionModel(selectionModel)

button = QtGui.QPushButton('Select from 0,0 to 1,2')
button.clicked.connect(clicked)
layout = QtGui.QVBoxLayout()
layout.addWidget(tableView)
layout.addWidget(button)
window.setLayout(layout)
window.show()

app.exec_()

select()也可以接受一个索引(和select行的模式),所以你可以这样做:

rows = [1,2,3]
indexes = [model.index(r, 0) for r in rows]
mode = QtCore.QItemSelectionModel.Select | QtCore.QItemSelectionModel.Rows
[tableView.selectionModel().select(index, mode) for i in indexes]