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