I am really struggling to figure out a way to do this. Say I implement a button very simply in a widget window:
self.button = QPushButton("Drag Me", self)
I can move its initialization point around the parent widget's area using self.button.move(x,y)
, and I can get mouse events from mousePressEvent(self, e)
via e.x()
and e.y()
, so that the button moves to wherever I click, but I just cannot seem to put all this together into a drag and drop framework.
Clarification: After reading on the 'true' meaning of Drag/Drop, that's not what I need. I just want to be able to move a widget around with my mouse, much similar to the way you move magnets on a fridge.
Here is an example of a moveable button that still supports the normal click signal properly:
In the
mousePressEvent
I record both the initial start position, and a position that will get updated throughout the drag.In the
mouseMoveEvent
, I get the proper offset of the widget from where it was clicked to where the actual origin is, so that the move is accurate.In the
mouseReleaseEvent
, I check to see if the overall move was greater than at least a tiny amount. If it was, then it was a drag and we ignore the normal event to not produce a "clicked" signal. Otherwise, we allow the normal event handler to produce the click.It depends on what you are trying to do. If you are trying to do actual "Drag & Drop", you're going about it wrong. What you are doing is just moving the button around in its X,Y coordinate space within its parent. Its never actually invoking any Drag/Drop events, those are entirely different.
You should read through the drag & drop documentation here:
http://doc.qt.nokia.com/4.7-snapshot/dnd.html
http://qt-project.org/doc/qt-5.0/qdrag.html
Instead of moving the button within the mousePressEvent, you'll need to create a new QDrag object and execute it. You can make it look like your button by taking a snapshot of your button using the QPixmap::grabWidget method and assign it to the QDrag instance using the QDrag::setPixmap method.
Event if all you are trying to do is move the widget around in the parent space, I would recommend using this framework and just accepting the drop event for your the button. Then you don't trigger a bunch of unnecessary redraws.