Qt ListWidget item 发起拖放

第一步:重写类 MyListWidget 继承自 QListWidget

第二步:重写 mousePressEvent 函数 和 mouseMoveEvent 函数

void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);

MyListWidget.h 文件

#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H

#include <QListWidget>
// 包含所有用到的界面类
#include <QtGui>

class MyListWidget : public QListWidget
{
    Q_OBJECT

public:
    MyListWidget(QWidget *parent);
    ~MyListWidget();

private:
    // 拖放起点
    QPoint m_startPos;
    // 被拖放的item
    QListWidgetItem* m_sitem;
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
};

#endif // MYLISTWIDGET_H

MyListWidget.cpp 文件

#include "MyListWidget.h"

MyListWidget::MyListWidget(QWidget *parent)
    : QListWidget(parent)
{

}

MyListWidget::~MyListWidget()
{

}

void MyListWidget::mousePressEvent(QMouseEvent* event)
{
    // 记下起点
    m_startPos = event->pos();
    m_sitem = this->itemAt(event->pos());
    // 记得调用父类的函数,保持原有的按键行为
    QListWidget::mouseMoveEvent(event);
}

void MyListWidget::mouseMoveEvent(QMouseEvent* event)
{
    // 只允许左键拖动
    if (!(event->buttons() & Qt::LeftButton))
    {
        return;
    }
    // 移动一定距离后才算是开始拖动
    if ((event->pos() - m_startPos).manhattanLength() < QApplication::startDragDistance())
    {
        return;
    }
    // 找到拖动的项
    if (m_sitem == NULL)
    {
        return;
    }
    QString itemText = m_sitem->text();
    // 创建数据
    QDrag* drag = new QDrag(this);
    QMimeData* mimeData = new QMimeData();
    mimeData->setText(itemText);
    drag->setMimeData(mimeData);
    // 设置拖动时的图像显示
    QPixmap drag_img(120, 18);
    QPainter painter(&drag_img);
    painter.drawText(QRectF(20, 0, 120, 18), itemText, QTextOption(Qt::AlignVCenter));
    drag->setPixmap(drag_img);
    // 启动拖放 start a drag
    Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction);
    // 检查操作有没有成功,有没有被取消
    if (Qt::IgnoreAction != result)
    {
        qDebug() << QString::fromLocal8Bit("成功完成拖拽");
    }
    // 按住 Ctrl 就是 Qt::CopyAction,没按 就是 Qt::MoveAction
}
原文地址:https://www.cnblogs.com/duxie/p/11806769.html