Qt - 控制阻力行为

时间:2010-03-10 18:21:15

标签: qt drag-and-drop

假设我希望我的可拖动窗口小部件的移动方式不同于在拖动时停留在光标下。例如,让窗口小部件仅在一个轴上移动,或者使窗口小部件移动两倍于光标和拖动起始点之间的距离。我应该覆盖哪种方法来定义这种行为?

2 个答案:

答案 0 :(得分:2)

我认为你应该问自己一个问题:你是否有一些我想要拖动到特定目标的可拖动元素(例如,你有一些小部件代表不同形状的碎片,应该拖到其他小部件上代表孔洞和每个洞穴“只接受相同形状的碎片)或者您只是想将一个小部件移动到另一个小部件上吗?

如果你需要拖拽和删除功能,在我看来,你无法在鼠标移动过程中真正改变行为 - 它或多或少地硬编码到QDrag对象中。

如果你只想移动东西,你应该只能重新实现鼠标移动/按下/释放事件(你可能还需要通过QWidget :: setMouseTracking方法启用鼠标跟踪)。

修改

这是“只是移动东西”的可拖动标签的示例代码:

#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来实现仅在一个轴上拖动。

答案 1 :(得分:0)

对于小部件,这四种方法控制拖动小部件的行为:

virtual void dragEnterEvent ( QDragEnterEvent * event )
virtual void dragLeaveEvent ( QDragLeaveEvent * event )
virtual void dragMoveEvent ( QDragMoveEvent * event )
virtual void dropEvent ( QDropEvent * event )

我猜你必须重新实现dragMoveEvent以实现你想要的目标。