[PySide] QListView: drag&drop custom item

Frank Rueter | OHUfx frank at ohufx.com
Mon Sep 19 10:47:59 CEST 2016


And one more follow up before I give up for the day:
I found some code online that decodes the byte stream returned by a 
QDropEvent.mimeData().data() method so I get the item instance back.
I worked that function into my example but the model refuses to append 
the dropped item.
A new instance of my custom item inside the drop event appends just 
fine, but not the actual dropped item or a copy of it. I just can't see 
what's wrong with this. Can somebody please have a look?
http://pastebin.com/UWWGXfNQ

If this fails I guess I will have to create a new item on the fly and 
make sure to copy all relevant data across, though that seems 
unnecessary and error prone.

Cheers,
frank


On 19/09/16 7:51 PM, Frank Rueter | OHUfx wrote:
> Thanks Jukka,
>
> that's probably not a bad idea considering how much time I have spent 
> trying to get this to work via QT.
> I had been toying with the idea of just sending a dictionary of the 
> relevant data, probably via a custom mime type, then re-creating the 
> custom item upon drop in the receiving view.
> I will keep that in mind as my last resort, but it feels like the 
> default implementation of the drop behaviour is soooo close, that it 
> should be possible to drop a custom item in some QT-ish way without 
> re-invening the wheel - or is that too optimistic?
>
> Here is a simple test code, hopefully we can get some more input with 
> that:
> http://pastebin.com/5UDPQFjh
>
> With this code, when dropping an item fro the left into the right 
> view, the print statement shows that a QStandardItem is produced 
> rather than the custom item.
>
> Any more takers?
>
> Cheers,
> frank
>
> On 19/09/16 7:31 PM, Purma Jukka wrote:
>> Hi,
>> since you asked any ideas... In my app I have had to re-invent 
>> drag&drop for some items (because I want to drag QGraphicsItems in 
>> scene while having all kinds of effects on the items they are 
>> connected while keeping the main event loop running etc. ) and 
>> learned a habit to give up when I didn’t find Qt-way of doing things 
>> and instead to choose the simplest pythonesque way.
>>
>> So in your case at this point, I would have
>> 1. 'start drag' store the dragged data, just the main payload, not 
>> the Q-item containing them, in some stable object (main window), just 
>> as ’main.dragged_object’.
>> 2. when drag gets dropped to those problem recipients, in drop event, 
>> manually put the data from main window into recipient, without 
>> bothering with the Q-representations of the data.
>>
>> In my app I have a multipurpose controller-object and ctrl.dragged is 
>> used to store the non-qt data of whatever is being dragged. It was my 
>> solution to struggle with QStandardItems and such.
>>
>> In conclusion, since we are doing things with Python + Qt, I think we 
>> are justified to skip Qt when there is an easier (or more readable) 
>> pythonesque way of doing things.
>>
>> Jukka
>>
>>> Frank Rueter | OHUfx <frank at ohufx.com> kirjoitti 19.9.2016 kello 9.56:
>>>
>>> Anybody?
>>> I'm still struggling with this. I went back to using a QStandardItem 
>>> for a while which solved the dag&drop behaviour, but now I really 
>>> need to use a custom item that inherits QStandardItem which breaks 
>>> the drop behaviour again.
>>>
>>> Any ideas or guidance would be greatly appreciated.
>>>
>>> Cheers,
>>> frank
>>>
>>>
>>> On 16/08/16 7:26 PM, Frank Rueter | OHUfx wrote:
>>>> Hi,
>>>>
>>>> I am trying to get drag&drop to work between two QListViews using a 
>>>> custom item.
>>>> I can't find the info I need online other than this document which 
>>>> helped a little bit but now I'm stuck.
>>>>
>>>> Drag&drop from one QListView to another works fine when I use a 
>>>> QStandardItem to hold my data, but when I use a custom item I run 
>>>> into trouble, because the receiving model/view creates a 
>>>> QStandardItem when the incoming custom items are dropped.
>>>>
>>>> Ideally I could tell the receiving model to use my custom item as 
>>>> the default item and otherwise just do it's thing, but I suppose it 
>>>> won't be that easy?!
>>>> I have played around with the receiving model's dropMimeData() and 
>>>> insertRows() methods but can't work out how to read the incoming 
>>>> data to then insert a custom item into the receiving model manually.
>>>> In QAbstractItemModel.dropMimeData() I tried reading 
>>>> mimeData.data('application/x-qabstractitemmodeldatalist'), but that 
>>>> returns a byte stream that I don't know how to handle.
>>>>
>>>> Do I have to re-implement the sender's drag data as well to send 
>>>> the custom item in the first place?
>>>>
>>>> It seems that everything works out of the box except the creation 
>>>> of the QStandardItem upon drop, rather than my custom item, so I am 
>>>> hoping I don't have to re-invent the (drag&drop) wheel just to get 
>>>> that one part right?!
>>>>
>>>> Any advise would be greatly appreciated.
>>>>
>>>> Thanks,
>>>> frank
>>>>
>>>>
>>>>
>>>> -- 
>>>> <Sähköpostiliite.png>    vfx compositing | workflow customisation 
>>>> and consulting
>>>>
>>>> _______________________________________________
>>>> PySide mailing list
>>>>
>>>> PySide at qt-project.org
>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>> _______________________________________________
>>> PySide mailing list
>>> PySide at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/pyside
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside




More information about the PySide mailing list