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

3
我使用QTableWidget作为用户的I / O功能,但我想通过禁用仅用于数据输出的单元格的可编辑性,使其更加用户友好和直观。
我可以在Qt Designer中为每个单独的单元格取消选中“可编辑”,但是一旦我使用self.table_item.setItem(row, column, QTableWidgetItem(str(value)))更改单元格的值,该单元格就会再次变为可编辑。 此问题/答案建议使用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()似乎是我需要使用的函数,但我不知道如何使用它使某些内容不可编辑,或者如何将其应用于单个单元格。
问题:在PyQt5中,如何在通过.setItem()更改QTableWidgetItem的值后,更改QTableWidget的单个单元格的“可编辑”标志。
如果您提供一种优雅的方法,使整行无法编辑,则会获得额外的虚拟互联网积分。
1个回答

9
你需要禁用标志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_())

如果您想优雅地禁用一行或一列,可以使用委托(delegate),其中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_())

非常感谢!这个解决方案完美地运行,易于实施,并且通过您的示例代码也很容易理解。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接