Изменить возможность редактирования для отдельных ячеек QTableWidget - PullRequest
1 голос
/ 04 июля 2019

Я использую QTableWidget как функцию ввода-вывода для пользователя, но хочу сделать его более удобным и интуитивно понятным, отключив возможность редактирования ячеек, предназначенных только для вывода данных.

Я могу снять галочку "Редактируемый "под флагами для каждой отдельной ячейки в Qt Designer, но как только я изменю значение ячейки с помощью self.table_item.setItem(row, column, QTableWidgetItem(str(value))), ячейки снова будут редактируемыми.

Этот вопрос / ответ предлагают использоватьself.table_item.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers), но это меняет флаг для всего элемента QTableWidget, а не только для одной ячейки.

Я также пробовал self.table_time.item(row,column).setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers), но получаю трассировку 'QTableWidgetItem' object has no attribute 'setEditTriggers'.

.setFlags() похоже на функцию, которую мне нужно использовать, но я не знаю, как использовать это, чтобы сделать что-то недоступным для редактирования или как применить это к отдельной ячейке.


Вопрос: Как изменить флаг "редактируемый" для отдельной ячейки QTableWidget в PyQt5 после изменения значения ячеек QTableWidgetItem через .setItem().


Вы получите дополнительное воображениеy Интернет-точки, если вы предоставляете дополнительное решение, которое сделает элегантным редактирование всей строки.

1 Ответ

2 голосов
/ 04 июля 2019

Вы должны отключить флаг Qt::ItemIsEditable:

from PyQt5 import QtCore, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        table_widget = QtWidgets.QTableWidget(4, 3)
        self.setCentralWidget(table_widget)

        it = QtWidgets.QTableWidgetItem("not editable")
        it.setFlags(it.flags() & ~QtCore.Qt.ItemIsEditable)
        table_widget.setItem(1, 1, it)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(320, 240)
    w.show()
    sys.exit(app.exec_())

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

from PyQt5 import QtCore, QtWidgets


class ReadOnlyDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        return


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        table_widget = QtWidgets.QTableWidget(4, 3)
        self.setCentralWidget(table_widget)

        delegate = ReadOnlyDelegate(table_widget)
        table_widget.setItemDelegateForRow(1, delegate)
        # table_widget.setItemDelegateForColumn(1, delegate)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(320, 240)
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...