更改 QTableWidget 单个单元格的可编辑性

Posted

技术标签:

【中文标题】更改 QTableWidget 单个单元格的可编辑性【英文标题】:Change editability for individual cells of QTableWidget 【发布时间】:2019-07-04 07:40:42 【问题描述】:

我使用 QTableWidget 作为用户的 I/O 功能,但我想通过禁用仅用于数据输出的单元格的可编辑性使其对用户更加友好和直观。

我可以取消选中 Qt Designer 中每个单独单元格的标志下的“可编辑”,但只要我用self.table_item.setItem(row, column, QTableWidgetItem(str(value))) 更改单元格的值,这些单元格就可以再次编辑。

This question/answer 建议使用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() 似乎是我确实需要使用的功能,但我不知道如何使用它来使某些内容不可编辑或如何将其应用于单个单元格。


问题: 在更改单元格 QTableWidgetItem 槽 .setItem() 的值后,如何在 PyQt5 中更改 QTableWidget 的单个单元格的“可编辑”标志。


如果您提供额外的解决方案以优雅的方式使整行不可编辑,您将获得额外的虚拟互联网积分。

【问题讨论】:

【参考方案1】:

您必须禁用标志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_())

【讨论】:

非常感谢!该解决方案完美运行,易于实施,并且您的示例代码也易于理解。

以上是关于更改 QTableWidget 单个单元格的可编辑性的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt中更改Qtablewidget的特定单元格背景颜色

QT QTableWidget设置单元格不可编辑

自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度

如何更改 qtablewidget 项的 qtooltip 的背景颜色?

如何在 QTableWidget 中获取单元格的索引?

在pyqt中隐藏qtablewidget中选定单元格的边框?