Qt - управление поведением перетаскивания - PullRequest
2 голосов
/ 10 марта 2010

Предположим, я хочу, чтобы мой перетаскиваемый виджет двигался иначе, чем просто оставался под курсором при перетаскивании. Например, если виджет перемещается только по одной оси или виджет перемещается вдвое больше расстояния между курсором и начальной точкой перетаскивания. Какой метод мне следует переопределить, чтобы определить этот тип поведения?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Думаю, вам следует задать себе вопрос: есть ли у вас перетаскиваемые элементы, которые я хочу перетащить на конкретные цели (например, у вас есть виджеты, представляющие фрагменты разных форм, которые следует перетаскивать на другие виджеты, представляющие отверстия и каждую "дыру" "принимает только кусочки одинаковой формы) или вы просто хотите переместить один виджет поверх другого виджета?

Если вам нужна функциональность перетаскивания, мне кажется, что вы не можете реально изменить поведение при перемещении мыши - оно более или менее жестко запрограммировано в объекте 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, чтобы добиться перетаскивания только по одной оси.

0 голосов
/ 11 марта 2010

Для виджета эти четыре метода управляют поведением перетаскиваемого виджета:

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

Я думаю, вам нужно переопределить dragMoveEvent, чтобы достичь того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...