【问题标题】:How to make particular cell editable and leave the rest non-editable in QTableWidget?如何使特定单元格可编辑并使其余单元格在 QTableWidget 中不可编辑?
【发布时间】:2020-06-06 23:28:12
【问题描述】:

我有不可编辑的 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)

编辑::

【问题讨论】:

    标签: python pyqt pyqt5 qtableview qtablewidget


    【解决方案1】:

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

    【讨论】:

    • 谢谢你。但似乎我仍然没有我需要的东西。我编辑了一个问题并添加了我的表格格式的 sn-p。我只需要编辑突出显示的单元格。我怎样才能实现你的逻辑?我在行和列上运行一个循环,我将为该特定单元格设置行和列索引以进行编辑。再次感谢!
    • @VirenKheni 将if index.column() == 2: 例如更改为if index.column() == 2 and index.row() == 2:
    • 是的,但是上面这段特殊的代码不能满足我的需要。它仍然使该单元格不可编辑。我试过你刚才说的。 @S.尼克
    • @VirenKheni 没有解释的图像根本没有帮助。您是否希望单元格 0x3 和 3x3 不可编辑,或者带有“NN”的单元格不可编辑?
    • 我只希望那些具有“NN”的单元格是可编辑的,其余的一切都保持只读状态。
    【解决方案2】:

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

    更好的方法是覆盖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)
    

    【讨论】:

    • 谢谢你。但似乎我仍然没有我需要的东西。我编辑了一个问题并添加了我的表格格式的 sn-p。我只需要编辑突出显示的单元格。我怎样才能实现你的逻辑?我在行和列上运行一个循环,我将为该特定单元格设置行和列索引以进行编辑。再次感谢!
    • 你能检查列行吗? if index.column() != 3 or index.row() not in (0, 3): trigger = self.NoEditTriggers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多