如何使 QTreeWIdgetItem 有选择地可编辑
How to make QTreeWIdgetItems editable selectively
所有单元格当前都是可编辑的(双击可编辑)。
我只需要第 0 列是可编辑的,而其他所有列都不是。
如何实现?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Tree(QtGui.QTreeWidget):
def __init__(self, *args, **kwargs):
super(Tree, self).__init__()
for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']):
rootItem = QtGui.QTreeWidgetItem()
rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
for n in range(7):
rootItem.setText(n, 'Root %s row %s'%(i, n) )
rootItem.sceneSG={}
rootItem.sceneSG['code']='nextSceneFilename'
for number in range(5):
childItem = QtGui.QTreeWidgetItem(rootItem)
childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
childItem.sceneSG={}
for m in range(7):
childItem.setText(m, 'Child %s row %s'%(number, m) )
rootItem.setData(100, 77, QtCore.Qt.UserRole )
self.addTopLevelItem(rootItem)
self.setColumnCount(5)
self.resize(360,240)
self.show()
tree=Tree()
app.exec_()
为了简单起见,我使用了 treeWidget 的 doubleClick
信号,该信号在进入 QTreeWidgetItem 的 setData
方法之前进行了处理。由于 onDoubleClick
方法获得了一个索引,我们可以提前将项目设置为可编辑或不可编辑。工作解决方案发布如下:
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Tree(QtGui.QTreeWidget):
def __init__(self, *args, **kwargs):
super(Tree, self).__init__()
for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']):
rootItem = QtGui.QTreeWidgetItem()
rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
for n in range(7):
rootItem.setText(n, 'Root %s row %s'%(i, n) )
rootItem.sceneSG={}
rootItem.sceneSG['code']='nextSceneFilename'
for number in range(5):
childItem = QtGui.QTreeWidgetItem(rootItem)
childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
childItem.sceneSG={}
for m in range(7):
childItem.setText(m, 'Child %s row %s'%(number, m) )
rootItem.setData(100, 77, QtCore.Qt.UserRole )
self.addTopLevelItem(rootItem)
self.setColumnCount(5)
self.doubleClicked.connect(self.onDoubleClick)
self.show()
def onDoubleClick(self, index):
item = self.currentItem()
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
if index.column()!=0:
item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)
tree=Tree()
app.exec_()
通常,您可以使用 QItemDelegate
/QStyledItemDelegate
来执行此操作。委托使您可以控制模型中的数据如何在视图中显示以及如何编辑 controller/view 中的数据并将其插入回模型中。它们允许您执行自定义绘画和自定义编辑器等操作。在这种情况下,我们只检查列索引并拒绝 return 编辑除第一列以外的任何内容。
class MyDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 0:
return super(MyDelegate, self).createEditor(parent, option, index)
return None
delegate = MyDelegate()
tree.setItemDelegate(delegate)
所有单元格当前都是可编辑的(双击可编辑)。 我只需要第 0 列是可编辑的,而其他所有列都不是。 如何实现?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Tree(QtGui.QTreeWidget):
def __init__(self, *args, **kwargs):
super(Tree, self).__init__()
for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']):
rootItem = QtGui.QTreeWidgetItem()
rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
for n in range(7):
rootItem.setText(n, 'Root %s row %s'%(i, n) )
rootItem.sceneSG={}
rootItem.sceneSG['code']='nextSceneFilename'
for number in range(5):
childItem = QtGui.QTreeWidgetItem(rootItem)
childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
childItem.sceneSG={}
for m in range(7):
childItem.setText(m, 'Child %s row %s'%(number, m) )
rootItem.setData(100, 77, QtCore.Qt.UserRole )
self.addTopLevelItem(rootItem)
self.setColumnCount(5)
self.resize(360,240)
self.show()
tree=Tree()
app.exec_()
为了简单起见,我使用了 treeWidget 的 doubleClick
信号,该信号在进入 QTreeWidgetItem 的 setData
方法之前进行了处理。由于 onDoubleClick
方法获得了一个索引,我们可以提前将项目设置为可编辑或不可编辑。工作解决方案发布如下:
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Tree(QtGui.QTreeWidget):
def __init__(self, *args, **kwargs):
super(Tree, self).__init__()
for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']):
rootItem = QtGui.QTreeWidgetItem()
rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
for n in range(7):
rootItem.setText(n, 'Root %s row %s'%(i, n) )
rootItem.sceneSG={}
rootItem.sceneSG['code']='nextSceneFilename'
for number in range(5):
childItem = QtGui.QTreeWidgetItem(rootItem)
childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable)
childItem.sceneSG={}
for m in range(7):
childItem.setText(m, 'Child %s row %s'%(number, m) )
rootItem.setData(100, 77, QtCore.Qt.UserRole )
self.addTopLevelItem(rootItem)
self.setColumnCount(5)
self.doubleClicked.connect(self.onDoubleClick)
self.show()
def onDoubleClick(self, index):
item = self.currentItem()
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
if index.column()!=0:
item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)
tree=Tree()
app.exec_()
通常,您可以使用 QItemDelegate
/QStyledItemDelegate
来执行此操作。委托使您可以控制模型中的数据如何在视图中显示以及如何编辑 controller/view 中的数据并将其插入回模型中。它们允许您执行自定义绘画和自定义编辑器等操作。在这种情况下,我们只检查列索引并拒绝 return 编辑除第一列以外的任何内容。
class MyDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 0:
return super(MyDelegate, self).createEditor(parent, option, index)
return None
delegate = MyDelegate()
tree.setItemDelegate(delegate)