如何在QTableWidget中使特定单元格可编辑,并使其余单元格不可编辑?

时间:2020-02-22 21:52:52

标签: python pyqt pyqt5 qtableview qtablewidget

我有一个不可编辑的QTableWidget。(我在创建Ui文件时设置了noEditTriggers)。我想使每行中的特定单元格可编辑。我怎样才能做到这一点?

我在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 个答案:

答案 0 :(得分:2)

@musicamante使用相同的基本原理是创建一个只返回特定列中的一个编辑器的委托,优点是您无需对QTableWidget进行子分类,而该逻辑可以在其他表中使用视图类型:

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_())

答案 1 :(得分:0)

您可以为每个项目设置标志,同时保留默认的编辑触发器,但这不是很好的方法,因为您的表可能很大,某些项目可能会被更改/添加/删除,您可能会忘记设置/重置标志。

一种更好的方法是重写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)