第一步:重写类 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 }