from PySide import QtGui, QtCore from PySide.QtCore import Qt import sys class MyModel(QtCore.QAbstractListModel): def __init__(self, lst, parent=None): super(MyModel, self).__init__(parent) self.lst = lst def moveItem(self, fromi, toi): print "move %d->%d" % (fromi, toi) self.beginMoveRows(QtCore.QModelIndex(), fromi, fromi, QtCore.QModelIndex(), toi) item = self.lst.pop(fromi) self.lst.insert(toi, item) self.endMoveRows() print "done" def rowCount(self, parent=QtCore.QModelIndex()): return len(self.lst) def data(self, index, role=Qt.DisplayRole): if index.isValid(): if role == Qt.DisplayRole: return str(self.lst[index.row()]) return None if __name__ == '__main__': app = QtGui.QApplication(sys.argv) lv = QtGui.QListView() lv.setModel(MyModel(["a", "b", "c"])) lv.show() lv.model().moveItem(1,0) lv.model().moveItem(0,1) app.exec_()