python - 如何在 QTableWidget 中使特定单元格可编辑并使其余单元格不可编辑?
问题描述
我有不可编辑的 QTableWidget。(我在创建 Ui 文件时设置了 noEditTriggers)。我想让每一行的特定单元格都可以编辑。我怎么能做到这一点?
我在 SO 和其他平台上查看了几个答案,但没有得到任何对我有用的东西。
目前我正在使用这段代码。它没有给出错误,但我仍然无法编辑该单元格值。
self.item = QTableWidgetItem('Hi')
flags = self.item.flags()
flags ^= QtCore.Qt.ItemIsEditable
self.item.setFlags(flags)
self.table.setItem(row, column, self.item)
编辑::
解决方案
对@musicamante答案使用相同的基础是创建一个仅在特定列中返回一个编辑器的委托,优点是您不需要对 QTableWidget 进行子分类,并且该逻辑可以用于其他类型的视图:
class Delegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 2:
return super(Delegate, self).createEditor(parent, option, index)
delegate = Delegate(self.table)
self.table.setItemDelegate(delegate)
更新:
如果您希望具有 NN 的单元格是可编辑的,那么您必须在满足该条件时返回编辑器:index.data() == "NN"
import random
import sys
from PyQt5 import QtWidgets
class Delegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
if index.data() == "NN":
return super(Delegate, self).createEditor(parent, option, index)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
texts = ["Hello", "Stack", "Overflow", "NN"]
table = QtWidgets.QTableWidget(10, 5)
delegate = Delegate(table)
table.setItemDelegate(delegate)
for i in range(table.rowCount()):
for j in range(table.columnCount()):
text = random.choice(texts)
it = QtWidgets.QTableWidgetItem(text)
table.setItem(i, j, it)
table.resize(640, 480)
table.show()
sys.exit(app.exec_())
推荐阅读
- python - pyaudio 有效,但输出播放时间少于实际时间
- regex - 如何在文件中格式化特定的替换?
- google-signin - 无法获取已注册的项目详细信息,谷歌开发者控制台
- python - 如何在 seaborn 图中显示多条线?
- android - 如何在没有密钥的情况下在android中解析JSONArray
- angular - 未捕获(承诺):错误:无法匹配任何路由。URL 段:应用程序
- python - openpyxl 不使用嵌套循环保存
- javascript - 在for循环中单击时如何禁用按钮单元?
- firebase - 试图通过用户 uid firebase 分离数据?
- symbolic-math - 在 Maxima 中使用letsimp进行简化,发生了什么?