簡體   English   中英

如何使QTreeWIdgetItems有選擇地可編輯

[英]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_()

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

為簡單起見,我使用的是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_()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM