как предотвратить выбор строки по клику пользователя при сохранении программного выбора строки? - PullRequest
1 голос
/ 03 мая 2019

В моем приложении есть QTableView со строками, которые выбираются программно, например, после выполнения запроса к данным.

Как запретить пользователю изменять выбранные строки при щелчке, сохраняя при этомвозможность выбирать строки программно?

Это мой код:

self.table = QTableView()
pandas_model: QAbstractTableModel = PandasTableModel(self.data_frame, self)
self.table.setModel(pandas_model)
self.table.setSortingEnabled(False)
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)  # full width table
self.table.setSelectionMode(QAbstractItemView.MultiSelection)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)

Должен ли я переопределить его ItemSelectionModel, чтобы предотвратить поведение по умолчанию при щелчке пользователя при сохранении режима программного выбора?Как мне этого добиться?

1 Ответ

2 голосов
/ 03 мая 2019

Если вы не хотите, чтобы пользователь мог выбрать элемент (ы), строку (и) или столбец (столбцы), вы должны сделать следующее:

  • Переписать делегат метода editorEvent, чтобы он не уведомлял о щелчке представления.

  • Отключить возможность нажимать на разделы заголовков

from PyQt5 import QtCore, QtGui, QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def editorEvent(self, event, model, option, index):
        res = super(Delegate, self).editorEvent(event, model, option, index)
        if event.type() in (
            QtCore.QEvent.MouseButtonPress,
            QtCore.QEvent.MouseButtonRelease,
            QtCore.QEvent.MouseButtonDblClick,
            QtCore.QEvent.MouseMove,
            QtCore.QEvent.KeyPress
        ):
            return True
        return res


class TableView(QtWidgets.QTableView):
    def __init__(self, parent=None):
        super(TableView, self).__init__(parent)
        self.setSortingEnabled(False)
        self.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Stretch
        )
        self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        delegate = Delegate(self)
        self.setItemDelegate(delegate)
        self.horizontalHeader().setSectionsClickable(False)
        self.verticalHeader().setSectionsClickable(False)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    model = QtGui.QStandardItemModel()
    for i in range(15):
        for j in range(6):
            it = QtGui.QStandardItem("{}-{}".format(i, j))
            model.setItem(i, j, it)

    table = TableView()
    table.setModel(model)

    # emulate select by query
    import random

    for row in random.sample(range(model.rowCount()), 5):
        table.selectRow(row)

    table.resize(640, 480)
    table.show()
    sys.exit(app.exec_())
...