首页 > 解决方案 > 如何在 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)

编辑::

获取表格视图的片段

标签: pythonpyqtpyqt5qtableviewqtablewidget

解决方案


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

推荐阅读