【问题标题】:How to make QTreeWIdgetItems editable selectively如何使 QTreeWIdgetItem 有选择地可编辑
【发布时间】:2016-05-27 17:00:09
【问题描述】:

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

【问题讨论】:

标签: python pyqt pyqt4 qtreewidget qtreewidgetitem


【解决方案1】:

通常,您可以使用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)

【讨论】:

    【解决方案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_()
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多