Думаю, вам следует задать себе вопрос: есть ли у вас перетаскиваемые элементы, которые я хочу перетащить на конкретные цели (например, у вас есть виджеты, представляющие фрагменты разных форм, которые следует перетаскивать на другие виджеты, представляющие отверстия и каждую "дыру" "принимает только кусочки одинаковой формы) или вы просто хотите переместить один виджет поверх другого виджета?
Если вам нужна функциональность перетаскивания, мне кажется, что вы не можете реально изменить поведение при перемещении мыши - оно более или менее жестко запрограммировано в объекте QDrag.
Если вы просто хотите переместить объект, вы можете сделать это только путем переопределения событий мыши Move / Press / Release (вам также может понадобиться включить отслеживание мыши с помощью метода QWidget :: setMouseTracking).
EDIT:
Это пример кода для перетаскиваемой метки «просто перемещать вещи»:
#ifndef DRAGGABLELABEL_H
#define DRAGGABLELABEL_H
#include <QLabel>
#include <QPoint>
#include <QMouseEvent>
class DraggableLabel : public QLabel
{
Q_OBJECT
public:
explicit DraggableLabel(const QString &text, QWidget *parent = 0) : QLabel(text, parent) {}
protected:
void mousePressEvent(QMouseEvent *event) {
dragStart = event->pos();
}
void mouseMoveEvent(QMouseEvent *event) {
setGeometry(QRect(geometry().topLeft() + event->pos() - dragStart, rect().size()));
}
private:
QPoint dragStart;
};
#endif // DRAGGABLELABEL_H
Теперь вам просто нужно добавить его в свой основной виджет:
#include <QApplication>
#include <QWidget>
#include "draggablelabel.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget mainWindow;
DraggableLabel *label = new DraggableLabel("Test", &mainWindow);
mainWindow.setMinimumSize(200, 200);
mainWindow.show();
return a.exec();
}
Вы можете поэкспериментировать с moveMouseEvent, чтобы добиться перетаскивания только по одной оси.