I have to admit I didn't understand your post
QDrag::start returns an information if the drag was accepted and with which action. If it was dropped on an invalid target, it will return IgnoreAction, if it was dropped on a valid target but the drop was rejected, it will return IgnoreAction. If it was dropped on a valid target and the target did something with the data (no matter if the target is in the same application as the source or if it's a completely different program), it will return an action telling you what should you do with the data -- copy, move, link or ignore it. If you drop on Firefox and firefox accepts the drop, you'll receive CopyAction. So you'll always know what you should do with the item.
Does that solve your problem? If you have doubts, please look at the puzzle example bundled with Qt and at the definition of the puzzle widget (or whatever it's called). The widget does the thing I think you want to do, just it doesn't use model-view, but the idea remains. If a drag is started, the item gets removed from the widget, if a valid drop occurs, the item gets inserted in a new position. If an invalid drop occurs, the item gets inserted back into the place it was taken from. No matter where you actually drop the item (and by using a custom MIME type it assures that you won't make a valid drop outside the puzzle application).
Bookmarks