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

时间:2019-07-04 07:40:42

标签: python python-3.x pyqt pyqt5

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


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


如果您提供其他解决方案以使整行无法通过优雅的方式进行编辑,那么您将获得额外的虚构Internet积分。

1 个答案:

答案 0 :(得分:2)

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