【问题标题】:Change editability for individual cells of QTableWidget更改 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 的单个单元格的“可编辑”标志。


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

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案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_())
    

    【讨论】:

    • 非常感谢!该解决方案完美运行,易于实施,并且您的示例代码也易于理解。
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2020-06-06
    • 2021-06-20
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多