2011-12-28 3 views
2

私はクラスMyListModelを持っています。これはQListViewまたはカスタムサブクラスを使用して表示されているQAbstractListModelから継承されています。私はリストの各項目を編集可能にしたいと思います。ユーザーがドラッグアンドドロップして項目の順序を並べ替えることができるようにしたいと思います(私は実際にQListViewを使う方法を確信していませんが、あまりにも多くのトラブルなしで動作します。)アイテムの並べ替えQAbstractListModel - dropMimeDataは呼び出されません

アイテムはドラッグ可能ですが、少し外に出ている円を表示しています。つまり、何もドロップできません。

私はthis questionで提案されたすべてを試しましたが、何も動作していないようです。 dropMimeData関数は呼び出されませんが、mimeDataはプレースホルダデータを生成するようです。

私は他のクラスで何か間違っているとは思わないので、モデルクラスをこの投稿に入れています。スペーシングはちょっとファンキーです。

ありがとうございました。

マイモデル:

class MyListModel(QtCore.QAbstractListModel): 

def __init__(self, parent, items=None): 
    super(self.__class__, self).__init__() 
    print "initiating MyListModel" 
    self.parent = parent 
    self._items = list() 

    for thing in items: 
     self._items.append(thing) 

    self.setSupportedDragActions(QtCore.Qt.MoveAction) 

def rowCount(self, parent = QtCore.QModelIndex()): 
    return len(self._items) 

def data(self, index, role = QtCore.Qt.DisplayRole): 
    if (role == QtCore.Qt.DisplayRole) or (role == QtCore.Qt.EditRole): 
     return self._items[index.row()].name 
    else: 
     return 

def setData(self, index, value, role=QtCore.Qt.EditRole): 
    print "Setting Data", value, "at", index.row(), 

    if role == QtCore.Qt.EditRole: 
     print "EditRole" 
     self._items[index.row()].name = value 
     return True 
    elif role == QtCore.Qt.DisplayRole: 
     print "DisplayRole" 
     print role 
     return False 
    else: 
     print "other" 
     print role 
     return False 


def flags(self, index): 
    return (QtCore.Qt.ItemIsEnabled | 
        QtCore.Qt.ItemIsSelectable | 
        QtCore.Qt.ItemIsEditable | 
        QtCore.Qt.ItemIsDragEnabled | 
        QtCore.Qt.ItemIsDropEnabled) 

def insertRows(self, row, count, parent): 
    print "insertRows" 
    self.beginInsertRows(parent, row, (row + (count - 1))) 
    #self._items.insert(row, object) 
    self.endInsertRows() 
    return True 


def supportedDropActions(self): 
    print "supportedDrop" 
    return (QtCore.Qt.MoveAction | QtCore.Qt.CopyAction) 

def supportedDragActions(self): 
    print "supportedDraw" 
    return (QtCore.Qt.MoveAction | QtCore.Qt.CopyAction) 

def mimeData(self, indexes): 
    print "mimeData at (", indexes[0].row(), ",", indexes[0].column(), ")", 
    self.old_index = indexes[0].row() 

    old_stuff = pickle.dumps(self._items[indexes[0].row()]) 
    print type(old_stuff) 
    mimeData = QtCore.QMimeData() 
    mimeData.setText(old_stuff) 

    return mimeData 

def dropMimeData(self, data, action, row, column, parent): 
    print "dropMimeData" 
    ''' 
    self.beginInsertRows(parentIndex, row, row) 

    if action == QtCore.Qt.IgnoreAction: 
     return True 

    if data.hasText(): 
     print data 
    return False 
    ''' 

def mimeTypes(self): 
    print 'mimeTypes' 
    return list("text/plain") 

答えて

0

これは遅れているが、あなたはまた、あなたのビューでDRAP &ドロップモードを設定する必要があります。 mimeData方法で

class MyListView(QListView): 
def __init__(self, parent=None): 
    QListView.__init__(self, parent) 

    self._model = MyListModel(self) 
    self.setModel(self._model) 

    self.setDragDropMode(QAbstractItemView.InternalMove) 

Documentation

0

mimeData = super(MyListModel, self).mimeData(indexes)mimeData = QtCore.QMimeData()を変更してみてください。

ご自分で作成した場合、それがすぐに削除されるような場合は、mimeDataオブジェクトの存続期間に問題があると考えています。あなたが上記を行う場合、それは正しい生涯を持っているようです。しかし、これは単なる推測です。

関連する問題