PyQt QTableView получить начальный индекс ячейки, охватывающей несколько столбцов? - PullRequest
1 голос
/ 18 апреля 2019

У меня есть QTableView с ячейками, для которых я установил интервалы столбцов 1, 2 и 4. Я пытаюсь сделать так, чтобы при выделении ячейки все ячейки над ней также автоматически выбирались, поэтому в примере щелчок ниже x выделит все эти ячейки:

enter image description here

Я попытался сделать это, просто перебрав все выбранные индексы и выделив ячейки на одну строку выше, однако кажется, что выбор ячейки, охватывающей несколько столбцов, работает, только если вы выберете самый левый индекс этого. В моем примере выбор индекса (1,1) или индекса (0,2) ничего не делает. Поэтому мне нужно иметь возможность выбрать ячейку с учетом любого индекса, который охватывает ячейка. Как я могу это сделать? Например, для заданного индекса (0,2) или индекса (0,3) они представляют собой одну и ту же ячейку с интервалом столбца 4, как программно определить, что эта ячейка начинается с индекса (0,0)

1 Ответ

2 голосов
/ 19 апреля 2019

Вы должны установить его как режим выбора в QAbstractItemView::MultiSelection, и чтобы выбрать его, вы должны использовать setSelection(), передав ему прямоугольник, принадлежащий QModelIndex:

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self._model = QtGui.QStandardItemModel(3, 8)
        self._table = QtWidgets.QTableView(
            selectionMode=QtWidgets.QAbstractItemView.MultiSelection,
            clicked=self.on_clicked,
        )
        self._table.setModel(self._model)
        self.fill_table()
        self.setCentralWidget(self._table)

    def fill_table(self):
        data = [
            ('A', (0, 0), (1, 4)),
            ('B', (0, 4), (1, 4)),
            ('one', (1, 0), (1, 2)),
            ('two', (1, 2), (1, 2)),
            ('three', (1, 4), (1, 2)),
            ('four', (1, 6), (1, 2)),
            ('x', (2, 0), (1, 1)),
            ('y', (2, 1), (1, 1)),
            ('x', (2, 2), (1, 1)),
            ('y', (2, 3), (1, 1)),
            ('x', (2, 4), (1, 1)),
            ('y', (2, 5), (1, 1)),
            ('x', (2, 6), (1, 1)),
            ('y', (2, 7), (1, 1)),
        ]
        for text, (r, c), (rs, cs) in data:
            it = QtGui.QStandardItem(text)
            self._model.setItem(r, c, it)
            self._table.setSpan(r, c, rs, cs)

    @QtCore.pyqtSlot('QModelIndex')
    def on_clicked(self, ix):
        self._table.clearSelection()
        row, column = ix.row(), ix.column()
        sm = self._table.selectionModel()
        indexes = [ix]
        for i in range(row):
            ix = self._model.index(i, column)
            indexes.append(ix)
        for ix in indexes:
            r = self._table.visualRect(ix)
            self._table.setSelection(r, QtCore.QItemSelectionModel.Select)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...