alphanumeric
alphanumeric

Reputation: 19329

How to select multiple rows in QTableView using selectionModel

With:

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

tableView.selectRow(0) or tableView.selectRow(2) won't work in this situation since selectRow() selects only single row deselecting all others.

There is selectionModel().select() method available. But it accepts QSelectionItems object as the argument. How do we declare the QSelectionItem object having the row numbers?

Upvotes: 4

Views: 12895

Answers (3)

dave
dave

Reputation: 602

select() can also accept an index (and a mode of select rows), so you can do this:

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]

Upvotes: 2

alphanumeric
alphanumeric

Reputation: 19329

The code creates a QTableView and QPushButton. Pressing the button selects the indexes in continuous order (from index1 to index2. It is still an unswered question if it would be possible to select the indexes in any order.

enter image description here

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_()

Upvotes: 5

Onur Tuna
Onur Tuna

Reputation: 1060

You should set the selection mode.

tableView->setSelectionMode(QAbstractItemView::MultiSelection);

Upvotes: 8

Related Questions