This is a static archive of the Python wiki, which was retired in February 2026 due to lack of usage and the resources necessary to serve it — predominately to bots, crawlers, and LLM companies.
Pages are preserved as they were at the time of archival. For current information, please visit python.org.
If a change to this archive is absolutely needed, requests can be made via the infrastructure@python.org mailing list.

Handling an internal Qt MIME type

On the #pyqt channel on Freenode, reenen 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_())

2026-02-14 16:12