更改 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的特定单元格背景颜色
自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度