PyQt/Handling an internal Qt MIME type¶
Legacy Wiki Page
This page was migrated from the old MoinMoin-based wiki. Information may be outdated or no longer applicable. For current documentation, see python.org.
Handling an internal Qt MIME type¶
On the #pyqt{.backtick} channel on Freenode, reenen{.backtick} asked if it was possible to handle the internal MIME type Qt uses for drag and drop between item views.
See Handling Qt’s internal item MIME type for the details.
1 import sys
2 from PyQt4.QtCore import QDataStream, Qt, QVariant
3 from PyQt4.QtGui import *
4
5 class TreeModel(QStandardItemModel):
6
7 def __init__(self, parent = None):
8
9 QStandardItemModel.__init__(self, parent)
10
11 def dropMimeData(self, data, action, row, column, parent):
12
13 if data.hasFormat('application/x-qabstractitemmodeldatalist'):
14 bytearray = data.data('application/x-qabstractitemmodeldatalist')
15 data_items = self.decode_data(bytearray)
16
17 # Decode the data, assuming that we get 6 32-bit integers to
18 # start with, then a count byte followed by a string.
19 text = data_items[Qt.DisplayRole].toString()
20 for row in range(self.rowCount()):
21 name = self.item(row, 0).text()
22 if name == text:
23 number_item = self.item(row, 1)
24 number = int(number_item.text())
25 number_item.setText(str(number + 1))
26 break
27 else:
28 name_item = QStandardItem(text)
29 number_item = QStandardItem("1")
30 self.appendRow([name_item, number_item])
31
32 return True
33 else:
34 return QStandardItemModel.dropMimeData(self, data, action, row, column, parent)
35
36 def decode_data(self, bytearray):
37
38 data = {}
39
40 ds = QDataStream(bytearray)
41 while not ds.atEnd():
42
43 row = ds.readInt32()
44 column = ds.readInt32()
45
46 map_items = ds.readInt32()
47 for i in range(map_items):
48
49 key = ds.readInt32()
50
51 value = QVariant()
52 ds >> value
53 data[Qt.ItemDataRole(key)] = value
54
55 return data
56
57 app = QApplication(sys.argv)
58
59 window = QWidget()
60
61 listModel = QStringListModel(["John", "Jane", "Frank", "Henry"])
62 listView = QListView()
63 listView.setModel(listModel)
64 listView.setDragEnabled(True)
65
66 treeModel = TreeModel()
67 treeView = QTreeView()
68 treeView.setHeaderHidden(True)
69 treeView.setRootIsDecorated(False)
70 treeView.setAcceptDrops(True)
71 treeView.setModel(treeModel)
72
73 layout = QHBoxLayout(window)
74 layout.addWidget(listView)
75 layout.addWidget(treeView)
76
77 window.show()
78 sys.exit(app.exec_())