Как сделать QLabel из Qt Draggable? - PullRequest
0 голосов
/ 29 февраля 2020

Моя проблема в том, что я хочу реализовать функцию перетаскивания в QLabel QT, я видел некоторые примеры в Qt, но не могу понять, как они их реализуют, я не понимаю, что такое MIME и все. На самом деле я занимаюсь наследованием класса QLabel для создания собственной метки и хочу, чтобы эта метка была перетаскиваемой, чтобы любой пользователь мог выбрать мою метку и поместить ее в любое место на экране виджета.

{
    Q_OBJECT
public:
    CustomLabel(QWidget* parent = nullptr) : QLabel(parent){ }

protected:

void mousePressEvent(QMouseEvent *event)
{
}

void mouseMoveEvent(QMouseEvent *event)
{
}

};

1 Ответ

0 голосов
/ 01 марта 2020

Предполагая, что вы не хотите реализовывать полные операции перетаскивания, а только перемещаете положение метки с помощью мыши, вот пример:

main. cpp

#include <QLabel>
#include <QMouseEvent>
#include <QMainWindow>
#include <QApplication>

class MovableLabel : public QLabel
{
public:
    MovableLabel(QWidget* parent = nullptr): QLabel(parent)
    {
        setAlignment(Qt::AlignCenter);
        setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
        setLineWidth(2);
    }
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton) {
            QApplication::setOverrideCursor(QCursor(Qt::ClosedHandCursor));
            m_pos = event->pos();
        }
    }
    void mouseMoveEvent(QMouseEvent *event) override
    {
        if (!m_pos.isNull()) {
            move(mapToParent(event->pos() - m_pos));
        }
    }
    void mouseReleaseEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton) {
            m_pos = QPoint();
            QApplication::restoreOverrideCursor();
        }
    }
private:
    QPoint m_pos;
};

class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        resize(600,400);
        auto label = new MovableLabel(this);
        label->setText("Move Me!");
        label->move(50, 50);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

project.pro

QT += core gui widgets
CONFIG += c++11
SOURCES += main.cpp
...