Nano Hash - криптовалюты, майнинг, программирование

как предотвратить выбор строки щелчком пользователя при сохранении программного выбора строки?

В моем приложении у меня есть 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, чтобы предотвратить поведение по умолчанию при щелчке пользователя при сохранении режима программного выбора? Как я мог этого добиться?


  • Не могли бы вы объяснить мне лучше, вы хотите отключить выбор в какое время? В какой части вашего кода выделено программно? Как долго происходит задержка выбора для программирования? Вообще выбор по программированию почти до настоящего времени. Возможно, с минимально воспроизводимым примером это поможет нам понять вас 03.05.2019
  • @eyllanesc, я постараюсь объяснить лучше. Эта таблица используется для отображения некоторых данных, загруженных из .csv, после чего пользователь может выполнить запрос к таким данным. После выполнения запроса я выбираю строки результирующего набора в QTableView. Теперь пользователь также может выбирать/отменять выбор некоторых строк, делая недействительным представление выполненного запроса. По этой причине я ищу способ запретить пользователю выбирать/отменять выбор строк щелчком мыши. Здесь github.com/izio7/AttributedGraphProfiler/blob/maurizio / полный исходный код. 03.05.2019
  • 1) Насколько я понимаю вы хотите, чтобы пользователь не мог изменять выборку, а должен оставаться только программный выбор, т.е. например, если по запросу выбран ряд 1.3 и 5, то пользователь не должен иметь возможности выбирать другие строки или отменить выбор любой из строк 1,3 и 5 Я прав? 2) Я не просил исходный код вашего проекта, я просил MCVE. 3) Если 1) верно, я предложу свое решение, не основываясь на каком-либо MCVE. 03.05.2019
  • Да, это правильно. Спасибо 03.05.2019
  • Еще один вопрос: может ли пользователь редактировать QTableView или он доступен только для чтения? 03.05.2019
  • Он доступен только для чтения 03.05.2019

Ответы:


1

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

  • Перезапишите метод делегата 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_())
03.05.2019
  • Я также заметил, что нажатие пробела может повлиять на выбор/отмену выбора строки, поэтому я добавил QEvent.KeyPress к событиям, которые следует игнорировать. 04.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..