第一步:重写类 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(, );
QPainter painter(&drag_img);
painter.drawText(QRectF(, , , ), 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
}

Qt ListWidget item 发起拖放的更多相关文章

  1. C/C++ Qt ListWidget 列表框组件应用

    ListWidget列表框组件,该组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget组件则只能实现单字段结构,ListWidget组件常 ...

  2. Qt listwigwt item 加入自定义元素

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  3. Qt graphic item日记

    今天在用用graphic view 加入graphic item的时候要引入一个context menu,自然就要对context menu上的action进行slot处理.可是graphic ite ...

  4. Qt listWidget和QListWidgetItem的简单使用

    简单的来实习了下 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QListWid ...

  5. C/C++ Qt 给ListWidget增加右键菜单

    在上一篇博文<C/C++ Qt ListWidget 列表框组件应用>中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWi ...

  6. Qt:QListWidgetItem

    0.说明 一个QListWidgetItem是QListWidget中的一项(一行). 每个Item都可以持有多部分的信息,并将它们在适当时候展示出来. 在构造一个Item时指明它所在的List Wi ...

  7. 【Win10应用开发】通过拖放来打开文件

    除了可以使用XXXFilePicker来浏览文件外,其实在UWP APP中,也可以向传统Windows窗口一样,通过拖放的方式来打开文件. 处理过程和WPF的原理差不多,毕竟都是一脉相承,于是,在学习 ...

  8. Qt图形视图框架公开课资料

    接受CSDN学院的邀请,讲一次公开课,主题是Qt图形视图框架,报名链接在这里:http://edu.csdn.net/huiyiCourse/detail/228. 内容有两部分:自定义Item和拖放 ...

  9. Qt Quick实现的涂鸦程序

    之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...

随机推荐

  1. Tensorflow r1.12及tensorflow serving r1.12 GPU版本编译遇到的问题

    1.git clone tensorflow serving 及tensorflow代码 2. ERROR: /root/.cache/bazel/_bazel_root/f71d782da17fd8 ...

  2. mongodb配置“主从”模式

    版本的mongodb不支持Master/slave模式了.推荐使用集群模式.大家都知道,集群模式需要多于三台的奇数台机器(奇数个进程测试有意义,实际意义不大)现在我的手头有两台主机,更合理的配置个人觉 ...

  3. nginx日志切割和日志清理

    ##########################日志切割################################1.上传脚本到/usr/local/nginx/logs/下 2.并附执行权 ...

  4. Jmeter多业务混合场景如何设置各业务所占并发比例

    在进行多业务混合场景测试中,需要分配每个场景占比. 具体有两种方式: 1.多线程组方式: 2.逻辑控制器控制: 第一种: jmeter一个测试计划可以添加多个线程组,我们把不同的业务放在不同的线程组中 ...

  5. DateUtil(2)

    import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

  6. saltstack执行state.sls耗时长的坑

    一直用的 jenkins + saltstack 自动化构建发布项目,一共也就不超过20台服务器,奈何运行时间越来越慢,并且负载越来越高(这里大部分都是使用state模块),但是不用state模块效率 ...

  7. C#反射技术的简单操作(读取和设置类的属性、属性值)

    public class A { public int Property1 { get; set; } } static void Main(){ A aa = new A(); Type type ...

  8. 用js实现promise

    /*       自定义promise         1. 执行MyPromise构造函数,要立即执行executor         2. promise实例对象,内部有三种状态          ...

  9. 七、spring生命周期之初始化和销毁方法

    一.通过@Bean指定初始化和销毁方法 在以往的xml中,我们是这样配置的 <bean id="exampleInitBean" class="examples.E ...

  10. QML CheckBox的使用

    "人类的全部历史都告诫有智慧的人,不要笃信时运,而应坚信思想. -- 爱献生" 这个在QT creator 帮助文档中非常容易查到. Import Statement: impor ...