qt - How to detect that an item in a QStandardItemModel is dropped onto another? -


how receive notification qstandarditem dragged , dropped onto qstandarditem, becoming child of latter?

i thought re-implementing qstandarditemmodel.moverows, not getting called after drop :( below example of i'm trying do. test, run program , drop 1 item in tree view onto another. if worked, should see confirmation in console moverows has been called.

from pyqt5.qtgui import * pyqt5.qtwidgets import * pyqt5.qtcore import *   class model(qstandarditemmodel):     def moverows(             self, source_parent, source_row, count, destination_parent,             destination_child):         print(             'moving {} row(s) row {} of parent {} row {} of parent {}'             .format(                 count, source_row, source_parent, destination_child,                 destination_parent)         )         super().moverows(             source_parent, source_row, count, destination_parent,             destination_child)         return true   def _create_item(text):     item = qstandarditem(text)     flags = qt.itemisdragenabled | qt.itemisselectable | qt.itemisenabled | qt.itemisdropenabled     item.setflags(flags)     return item   model = model() model.appendrow([_create_item('item 1')]) model.appendrow([_create_item('item 2')])  app = qapplication([]) view = qtreeview() view.setdragdropmode(view.internalmove) view.setmodel(model) view.show() app.exec_() 

from studying qstandarditemmodel source code, realized 1 has override qabstractitemmodel.dropmimedata, in order react item drops. qstandarditemmodel moves items around in implementation of dropmimedata, in way subclass can't hook into, have handle dropmimedata yourself.

this dropmimedata based solution, item representations included mime data python pickles:

import pickle pyqt5.qtgui import * pyqt5.qtwidgets import * pyqt5.qtcore import *   _mimetype = 'application/x-standarditemmodeldatalist'   class model(qstandarditemmodel):     def dropmimedata(             self, data, action, row, column, parent):         # access parent before calling super implementation, because may mutate parent         dest_str = 'parent {}'.format(parent.data(qt.displayrole)) if \             parent.isvalid() else 'root'          ret_val = super().dropmimedata(data, action, row, column, parent)         if action != qt.moveaction or not data.hasformat(_mimetype):             return ret_val          item_data = pickle.loads(data.data(_mimetype))[0]         print('moving {} {}'.format(item_data, dest_str))         return true      # override in order add custom mime data     def mimedata(self, indexes):         mimedata = super().mimedata(indexes)         data = [index.data(qt.displayrole) index in indexes]         mimedata.setdata(_mimetype, pickle.dumps(data))          return mimedata      # override in order announce our custom mime type     def mimetypes(self):         return super().mimetypes() + [_mimetype]   def _create_item(text):     item = qstandarditem(text)     flags = qt.itemisdragenabled | qt.itemisselectable | qt.itemisenabled | qt.itemisdropenabled     item.setflags(flags)     return item   model = model() model.appendrow([_create_item('item 1')]) model.appendrow([_create_item('item 2')])  app = qapplication([]) view = qtreeview() view.setdragdropmode(view.internalmove) view.setmodel(model) view.show() app.exec_() 

Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

How do you convert a timestamp into a datetime in python with the correct timezone? -