QT的 qdrag 和 qdrop功能在qt的"Puzzle"示例中有介绍。但是那个介绍是以QListWidget为基础的。本文以QWidget为基础,介绍如何实现拖放。拖放可以用QString作为信息载体,也可以使用html等类型。本文采用QByteArray。QByteArray允许程序员使用自定义的类型来作为信息载体。本文定义的类型是ST_INFO。

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDrag>
#include <QDropEvent>
#include <QMouseEvent>
#include <QLineEdit>
#include <QResizeEvent>#pragma pack(1)
struct ST_INFO
{bool b;int  i;
};
#pragma pack()class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();QPointF         m_pntPress;bool            m_bMimeAdded;QLineEdit     * m_pText1;QLineEdit     * m_pText2;QLineEdit     * m_pText3;protected:void    mousePressEvent(QMouseEvent *);void    mouseMoveEvent(QMouseEvent *);void    dropEvent(QDropEvent *);void    dragEnterEvent(QDragEnterEvent *);void    dragMoveEvent(QDragMoveEvent *);void    resizeEvent(QResizeEvent *);
};#endif // MAINWINDOW_H

cpp文件:

#include "mainwindow.h"
#include <QApplication>
#include <QMimeData>
#include <QDebug>
#include <QTextStream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{setAcceptDrops(true);m_pText1 = new QLineEdit(this);m_pText2 = new QLineEdit(this);m_pText3 = new QLineEdit(this);
}MainWindow::~MainWindow()
{delete m_pText1;delete m_pText2;delete m_pText3;
}void MainWindow::mouseMoveEvent(QMouseEvent *event)
{if ((QLineF(event->screenPos(), m_pntPress).length() < QApplication::startDragDistance()) || m_bMimeAdded){return;}m_bMimeAdded = true;QDrag *drag = new QDrag(this);QMimeData *mime = new QMimeData;drag->setMimeData(mime);QImage image("E:\\lena.jpg");drag->setPixmap(QPixmap::fromImage(image).scaled(30, 40));drag->setHotSpot(QPoint(15, 30));QByteArray qba;QString qstrTemp1 = m_pText1->text();QString qstrTemp2 = m_pText2->text();bool bTemp;if(qstrTemp1.contains("true")){bTemp = true;}else{bTemp = false;}ST_INFO stTemp = {bTemp, qstrTemp2.toInt()};qba.resize(sizeof(stTemp));memcpy(qba.data(), &stTemp, sizeof(stTemp));mime->setData(tr("INFO"), qba);drag->exec();
}void MainWindow::mousePressEvent(QMouseEvent *e)
{m_pntPress = e->screenPos();m_bMimeAdded = false;
}void MainWindow::dropEvent(QDropEvent *event)
{MainWindow *source = qobject_cast<MainWindow *>(event->source());if(source != this){if (event->mimeData()->hasFormat("INFO")){QByteArray pieceData = event->mimeData()->data("INFO");ST_INFO stTemp;memcpy(&stTemp, pieceData.data(), sizeof(stTemp));QString qstrTemp;QTextStream stream(&qstrTemp, QIODevice::WriteOnly);stream<<"b = "<<stTemp.b<<" i = "<<stTemp.i;m_pText3->setText(qstrTemp);event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}}else{event->ignore();}
}void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{if (event->mimeData()->hasFormat("INFO"))event->accept();elseevent->ignore();
}void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{if (event->mimeData()->hasFormat("INFO")) {event->setDropAction(Qt::MoveAction);event->accept();} else {event->ignore();}
}void MainWindow::resizeEvent(QResizeEvent *e)
{m_pText1->setGeometry(0,0,width()/2, height()/4);m_pText2->setGeometry(0, height()/3, width()/2, height()/4);m_pText3->setGeometry(width()/2, height()*2/3, width()/2, height()/4);
}

启动两个一模一样的应用。在第一个窗口中输入如下:

然后在第一个窗口中按下鼠标,拖向第二个窗口,松开:

可见,第一个窗口的信息被正确传入了第二个窗口。

用 QT实现拖放(drag-drop)功能相关推荐

  1. HTML5原生拖拽/拖放 Drag Drop 详解

    转载自:juejin.im/post/5a169d- 前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准 ...

  2. HTML5原生拖拽/拖放(drag drop)详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  3. h5物体拖动_HTML5原生拖拽/拖放(drag drop)详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  4. html5拖放详解,HTML5拖拽/拖放(drag drop)详解

    H5中拖拽属性: draggable: auto | true | false 拖动事件: - dragstart 在元素开始被拖动时触发 - dragend 在拖动操作完成时触发 - drag 在元 ...

  5. ASP.NET AJAX (Atlas) 拖放(Drag Drop)功能6种实现方法总结

    在Ajax程序中实现传统桌面程序中异常简单的拖放功能却并不是件容易的事情.然而Web上的拖放功能又如此的让人痴迷,所以几乎每个成熟的Ajax类库都提供了自己的一套实现拖放的封装,ASP.NET AJA ...

  6. 使用ASP.NET Atlas实现拖放(Drag Drop)效果(下)

    English Version: http://dflying.dflying.net/1/archive/77_atlas_drag__drop_overview.html 中文版:http://d ...

  7. HTML5 drag drop 拖拽与拖放简介

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1419 一.前面的话 ...

  8. html5css3菜鸟教程,HTML5+CSS3实现拖放(Drag and Drop)示例

    本文简单介绍一下HTML5的拖放实现.MXGHTML5中文学习网 - HTML5先行者学习网 拖放(Drag 和 drop)是 HTML5 标准的组成部分.MXGHTML5中文学习网 - HTML5先 ...

  9. html5 drag this,HTML5拖放(drag和drog)

    拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...

  10. QT自定义拖放_图片的移动

    QT自定义拖放_图片的移动 定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤: 鼠标按下事件 获取图片 自定义MIME类型 将数据放入QMimeData中 将QMimeDat ...

最新文章

  1. 计算机二级考试vb知识点,2016计算机二级《VB》考试重要知识点
  2. 如何评审功能测试用例?
  3. 一个自用的好看幻灯片代码
  4. php文件目录教程,php文件目录操作的开发过程与示例分享
  5. 2021-2025年中国电动陶瓷球阀行业市场供需与战略研究报告
  6. Wpf 简单制作自己的窗体样式
  7. 你那不是拖延症,只是习惯性逃避
  8. Qt5及模块架构分析
  9. [转]如何阅读systemstate dump
  10. QGIS插件开发详细教程
  11. java读取pdf的文字、图片、线条和对应坐标
  12. python word排版_python办公自动化:自动进行word文档处理和排版-docx文件
  13. 一些格言,希望自己铭记在心
  14. 如何在css中设置音乐效果,css实现简单音乐符效果
  15. XUI框架实现比原生框架更好看并且功能更齐全的EditText框?,以及如何获取EditText的值
  16. Redux原理(逐句解析)!!!
  17. Metasploit攻击win7实例(上)
  18. Java面试题目,CAS都不了解,你还怎么看J-U-C不可思议!
  19. 1193: [HNOI2006]马步距离
  20. OpenGL总结15-光照模型

热门文章

  1. 自定义video标签的大小
  2. 什么是发动机号,发动机号码是什么?
  3. Chrome 谷歌浏览器查看网站证书
  4. 车牌识别-基于模板匹配
  5. 英语语法篇 - 非谓语动词
  6. 邮件服务器超级用户,Postfix邮件服务器的安装与配置方法
  7. 服务器硬盘容量为0,硬盘容量不一样 raid0 扩容也可以很自如?
  8. html自动触发双击事件,js主动触发单击事件
  9. 推挽输出和开漏输出详解
  10. 指数函数对数函数导数定义推导