Как сделать конкретную ячейку редактируемой и оставить остальные недоступными для редактирования в QTableWidget? - PullRequest
1 голос
/ 23 февраля 2020

У меня есть QTableWidget, который нельзя редактировать. (У меня была настройка noEditTriggers при создании UI-файла). Я хочу сделать конкретную ячейку редактируемой из каждой строки. Как я могу это сделать?

Я посмотрел несколько ответов на SO и других платформах, но у меня ничего не получалось.

В настоящее время я использую этот кусок кода. это не дает ошибку, но я все еще не мог редактировать то значение ячейки.

self.item = QTableWidgetItem('Hi')
flags = self.item.flags()
flags ^= QtCore.Qt.ItemIsEditable
self.item.setFlags(flags)
self.table.setItem(row, column, self.item)

РЕДАКТИРОВАТЬ ::

Snippet to get the table view

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Использование той же основы для ответа @ musicamante состоит в создании делегата, который возвращает только один редактор в столбце Speci c, преимущество в том, что вам не нужно создавать подклассификацию QTableWidget и logi c может использоваться в других типах представлений:

class Delegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        if index.column() == 2:
            return super(Delegate, self).createEditor(parent, option, index)
delegate = Delegate(self.table)
self.table.setItemDelegate(delegate)

Обновление:

Если вы хотите, чтобы ячейки с NN были редактируемыми, то Вы должны вернуть редактор, когда он удовлетворяет этому условию: index.data() == "NN"

import random
import sys

from PyQt5 import QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        if index.data() == "NN":
            return super(Delegate, self).createEditor(parent, option, index)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    texts = ["Hello", "Stack", "Overflow", "NN"]

    table = QtWidgets.QTableWidget(10, 5)
    delegate = Delegate(table)
    table.setItemDelegate(delegate)

    for i in range(table.rowCount()):
        for j in range(table.columnCount()):
            text = random.choice(texts)
            it = QtWidgets.QTableWidgetItem(text)
            table.setItem(i, j, it)

    table.resize(640, 480)
    table.show()
    sys.exit(app.exec_())
0 голосов
/ 23 февраля 2020

Вы можете установить флаги для каждого элемента, оставляя триггеры редактирования по умолчанию, но это не очень хороший подход, поскольку у вас может быть очень большая таблица, некоторые элементы могут быть изменены / добавлены / удалены, и вы можете забыть установить / сбросить флаги.

Лучшим подходом может быть переопределение метода edit() и выполнение реализации по умолчанию (которая создает редактор элементов и запускает редактирование) путем ручной настройки триггер редактирования.
Для этого необходимо оставить установленные триггеры редактирования по умолчанию (или хотя бы один метод триггера).

class TableWidget(QtWidgets.QTableWidget):
    def edit(self, index, trigger, event):
        # editing is allowed only for the third column
        if index.column() != 2:
            trigger = self.NoEditTriggers
        return super().edit(index, trigger, event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...