![](/img/trans.png)
[英]Make a cell editable (after creating the table with non-editable cells) with ctrl+click
[英]How to make particular cell editable and leave the rest non-editable in 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_())
您可以為每個項目設置標志,同時保留默認的編輯觸發器,但這不是很好的方法,因為您可能有一個非常大的表,某些項目可能會被更改/添加/刪除,您可能會忘記設置/重置旗幟。
更好的方法可能是覆蓋edit()
方法,並通過手動設置編輯觸發器來執行默認實現(創建項目編輯器並開始編輯)。
這需要保留默認的編輯觸發器(或至少一種觸發器方法)設置。
class TableWidget(QtWidgets.QTableWidget):
def edit(self, index, trigger, event):
# editing is allowed only for the third column
if index.column() != 2:
trigger = self.NoEditTriggers
return super().edit(index, trigger, event)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.