簡體   English   中英

QStandardItem 子類中克隆的實現

[英]Implementation of clone in QStandardItem subclass

我使用 QStandardItemModel 和 QTreeView 來顯示自定義項目。 這些項目有三種不同的類型 FILTER_TYPE、MODIFIER_TYPE 和 GROUP_TYPE。

我希望能夠使用視圖中的拖放(InternalMove)重新排序 model 中的項目。 如果我理解正確,我必須在我的 model 上使用 setItemPrototype(MyItem()) 以便它在移動項目時使用自定義 MyItem 而不是一般的 QStandardItem。

我的理解是創建自定義 MyItem 的新實例,然后將舊項目中的所有數據和標志復制到新項目。 但是,似乎 model 只初始化一個新的 MyItem 而從不復制數據。

因此:如何在 MyItem 子類中重新實現 QStandardItem.clone() 以將所有數據和標志復制到新項目中? 我是否必須通過所有自定義數據角色手動 go 並將其值分配給新項目?

項目 class 如下所示:

class MyItem(QtGui.QStandardItem):
    FILTER_TYPE = QtGui.QStandardItem.UserType + 1
    MODIFIER_TYPE = QtGui.QStandardItem.UserType + 2
    GROUP_TYPE = QtGui.QStandardItem.UserType + 3

    TYPE = QtCore.Qt.UserRole + 0
    NAME = QtCore.Qt.UserRole + 1 
  
    IS_PROCESSED = QtCore.Qt.UserRole + 5
    OUTPUT = QtCore.Qt.UserRole + 6

    FN = QtCore.Qt.UserRole + 7
    DEFAULT_PARAMS = QtCore.Qt.UserRole + 8
    PARAMETER_SET = QtCore.Qt.UserRole + 9

    def __init__(self):
        super().__init__()

        self.name = ""
        self.full_name = ""
        self.description = ""

        self.fn = None
        self.default_params = None
        self.parameter_set = None

        self.is_active = True
        self.is_processed = False
        self.output = None

        self.icon = QtGui.QIcon()

    def clone(self):
        item = Item() 
        
        ??? WHAT GOES HERE TO COPY ALL DATA AND FLAGS ???
            
        return item

    def __setattr__(self, name, value):
        if name == 'name':
            self.setData(value, self.NAME)
        elif name == 'full_name':
            self.setData(value, QtCore.Qt.DisplayRole)
            self.setData(value, QtCore.Qt.EditRole)
        elif name == 'description':
            self.setData(value, QtCore.Qt.ToolTipRole)
        
        ...

        else:
            super().__setattr__(name, value)

    def __getattribute__(self, name):
        if name == 'name':
            return self.data(self.NAME)
        elif name == 'full_name':
            return self.data(QtCore.Qt.DisplayRole)
        elif name == 'description':
            return self.data(QtCore.Qt.ToolTipRole)

        ...

        else:
            return super().__getattribute__(name)

    def initializeItem(self, type_, name, full_name, description="", fn=None, default_params=None):
        
        self.name = name
        self.full_name = full_name
        self.description = description
        
        self.fn = fn
        self.default_params = default_params
        self.parameter_set = ParameterSet(params_list=default_params)

        self.setData(type_, self.TYPE)
        
        flags = QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsDragEnabled|QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled
        if type_ == self.FILTER_TYPE:
            self.icon = QtGui.QIcon('resources/filter.png')
            flags = flags|QtCore.Qt.ItemNeverHasChildren
        elif type_ == self.MODIFIER_TYPE:
            self.icon = QtGui.QIcon('resources/modifier.png')
            flags = flags|QtCore.Qt.ItemIsDropEnabled
        elif type_ == self.GROUP_TYPE:
            self.icon = QtGui.QIcon('resources/folder.png')
            flags = flags|QtCore.Qt.ItemIsDropEnabled|QtCore.Qt.ItemIsEditable
        self.setFlags(flags)

    def type(self):
        return self.data(self.TYPE)

      

Model 實現如下所示:

from tree.items import MyItem


class TreeModel(QtGui.QStandardItemModel):
    
    def __init__(self):
        super().__init__()

        self.setItemPrototype(MyItem())

“克隆”的邏輯是使用與項目相同的信息創建 object,因此在這種情況下,您使用角色來存儲該信息,因此您必須將所有信息復制到新項目中,在這種情況下,您可以使用數據流:

def clone(self):
    item = MyItem()
    ba = QtCore.QByteArray()
    ds = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
    ds << self
    ds = QtCore.QDataStream(ba)
    ds >> item
    return item

暫無
暫無

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

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