如何使QTreeWIdgetItems有选择地可编辑

2024-10-02 10:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here

所有单元格当前都是可编辑的(双击可编辑)。 我只需要列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_()

Tags: inselftreeapp编辑forinitrange
2条回答

为了简单起见,我使用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来实现这一点。委托可以控制模型中的数据在视图中的显示方式,以及如何编辑控制器/视图中的数据并将其插入模型中。它们允许你做一些事情,比如定制绘画和定制编辑器。在本例中,我们只需检查列索引并拒绝为第一列返回编辑器。在

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)

相关问题 更多 >

    热门问题