qt中实现鼠标拖动一张图片到qt控件内,图片自动在控件中展示

很多电脑软件都有鼠标拖动一张图片或者拖动一个文件到软件的指定区域内,就可以自动在软件中显示图片内容或者文件内容。qt中也可以这样实现。
本文介绍两种方法:
1、只可以以非管理员的身份运行软件时,才可以实现上述功能。
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//重写下面2个函数来完成接受外来拖拽的操作.void dragEnterEvent(QDragEnterEvent *event);void dropEvent(QDropEvent *event);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDropEvent>
#include <QMimeData>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setAcceptDrops(true);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{if (event->mimeData()->hasUrls()){event->acceptProposedAction();}
}void MainWindow::dropEvent(QDropEvent *event)
{if (event->mimeData()->hasUrls()){QList<QUrl> urlList = event->mimeData()->urls();if (urlList.size() == 1){QString filePath = urlList.first().toLocalFile();QPixmap pixmap(filePath);pixmap.scaled(ui->pictureLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);ui->pictureLabel->setPixmap(pixmap);}}event->acceptProposedAction();event->setDropAction(Qt::MoveAction);event->accept();
}
效果:

QQ录屏20231225103401

2、以管理员身份运行软件时,也可以实现上述的功能。
(1)、需要在.pro文件中加上两个静态依赖库,Ole32.lib, User32.lib
CustomDragDrap.proQT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetwin32:CONFIG(release, debug|release): LIBS += -lOle32
else:win32:CONFIG(debug, debug|release): LIBS +=  -lOle32d
else:unix: LIBS += -lOle32INCLUDEPATH += $$PWD/../lib
DEPENDPATH += $$PWD/../libwin32:CONFIG(release, debug|release): LIBS += -lUser32
else:win32:CONFIG(debug, debug|release): LIBS += -lUser32d
else:unix: LIBS += -lUser32INCLUDEPATH += $$PWD/../lib
DEPENDPATH += $$PWD/../lib
(2)、在main.cpp中设置允许管理员身份获取拖放事件。
main.cpp#include "mainwindow.h"#include <QApplication>
#include "Windows.h"
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;//处理当以管理员身份运行程序时,不能捕捉到文件拖放事件的问题{void* user32 = LoadLibraryA("user32");FARPROC func = GetProcAddress((HMODULE)user32, "ChangeWindowMessageFilter");user32 = LoadLibraryA("user32");func = GetProcAddress((HMODULE)user32, "ChangeWindowMessageFilter");ChangeWindowMessageFilter(WM_DROPFILES, 1);qDebug() << w.winId() << w.effectiveWinId();ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), WM_DROPFILES, MSGFLT_ALLOW, NULL);ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), WM_COPYDATA, MSGFLT_ALLOW, NULL);ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), 0x0049, MSGFLT_ALLOW, NULL);DragAcceptFiles((HWND)w.effectiveWinId(), true);RevokeDragDrop((HWND)w.winId());}w.show();return a.exec();
}
(3)、重写nativeEvent获取拖放事件中的数据
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected://重新该函数实现捕获系统的拖放事件和数据bool nativeEvent(const QByteArray &eventType, void *message, long *result);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMimeData>
#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Windowsx.h>
#endifMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setAcceptDrops(true);
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{if (eventType == "windows_generic_MSG"){MSG* msg = static_cast<MSG*>(message);if (msg->message == WM_DROPFILES){*result = 0;
#ifdef Q_OS_WINMSG* msg = reinterpret_cast<MSG*>(message);HDROP dropHandle = reinterpret_cast<HDROP>(msg->wParam);int numFiles = DragQueryFile(dropHandle, 0xFFFFFFFF, nullptr, 0);if (numFiles > 0){//获取鼠标释放时的位置HWND hWnd = msg->hwnd;POINT point;GetCursorPos(&point);ScreenToClient(hWnd, &point);WCHAR filePath[MAX_PATH];DragQueryFileW(dropHandle, 0, filePath, MAX_PATH);// 处理拖入文件的路径QString picturepath = QString::fromWCharArray(filePath);//显示图片QPixmap pixmap(picturepath);ui->pictureLabel->setPixmap(pixmap);}DragFinish(dropHandle);return true;
#elseQ_UNUSED(message)return false;
#endif}}return QWidget::nativeEvent(eventType, message, result);
}
效果

QQ录屏20231225105502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

orangepi--开发板配置网络SSH登录

常用指令&#xff1a; ifconfig-------------------------------------查看网络地址 sudo passwd orangepi-------------------------改密码 nmcli dev wifi-------------------------------查看wifi nmcli dev wifi connect xx password xx--------连接网络 ip addr show wla…

【PTA】L1-016 验证身份(C++)

题目链接 &#xff1a; 题目要求&#xff1a; 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0…

【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

成交订单的条件是什么?搞清楚后再去开发客户

订单&#xff0c;也就是贵司某个产品满足了客户的需求&#xff0c;双方达成合作意向&#xff0c;说白也就是商品需求和供给的匹配。 那么&#xff0c;想要客户下订单&#xff0c;就要弄明白什么样的产品才能满足客户的需求匹配&#xff1f;了解客户关心的点在哪些方面&#xf…

python脚本抢各大平台大额优惠卷

文章目录 python脚本抢各大平台大额优惠卷写在前面准备阶段一、所需工具二、ChromeDriver下载教程 三、Seleuinm安装1、打开cmd&#xff0c;输入如下命令 开始抢券淘宝脚本京东抢购脚本 python脚本抢各大平台大额优惠卷 写在前面 当电商平台上演盛大的购物狂欢时&#xff0c;如…

SpringBoot3 基础特性

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站&#xff1a;Spring Boot banner 在线生成工具&#xff0c;制作下载英文 banner.txt&#xff0c;修改替换 banner.txt 文字实现自定义&#xff0c;个性化…

数据驱动与数据安全,自动驾驶看得见的门槛和看不见的天花板

作者 |田水 编辑 |德新 尽管心理有所准备&#xff0c;2023年智能驾驶赛道的内卷程度还是超出了大多数人的预期。 这一年&#xff0c;汽车价格战突然开打&#xff0c;主机厂将来自销售终端的价格压力&#xff0c;传导到下游智驾供应商&#xff0c;于是&#xff0c;市面上出现…

医院云HIS系统源码,saas多医院版,适用于专科医院、集团医院、基层医院

医院云HIS系统源码&#xff0c;自主研发&#xff0c;自主版权&#xff0c;电子病历病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统…

数据结构:单调栈

1.单调栈 单调栈是一种数据结构&#xff0c;其中存放的数据应该是有序的&#xff0c;所以单调栈也有单调递减栈和单调递增栈 单调递增栈&#xff1a;栈顶到栈底的元素大小是从小到大 单调递减栈&#xff1a;栈顶到栈底的元素大小是从大到小 单调栈主要就是用来求一个给定序列中…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

ESP8266 ESP-01/01s 工作模式与固件下载烧录接线

注意点&#xff1a; ESP8266 ESP-01与 ESP8266 ESP-01s接线类似 。本文使用的是ESP8266 ESP-01 WIFI模块&#xff0c;详细信息见如下图片。本文固件下载的是ESP8266 的MQTT固件&#xff0c;下载其它固件流程一致。本文使用的是杜邦线连接面包板来进行使用&#xff0c;与使用开发…

《人生何处不相逢》歌词解析

很少仔细思考某首歌的歌词&#xff0c;上次解析还是费玉清的《一剪梅》&#xff0c;不过那个在我的小红书上&#xff0c;这首歌曲子罗大佑的作品&#xff0c;简宁填词&#xff0c;陈慧娴演唱&#xff0c;表达了对缘分的无常和缘尽的伤感&#xff0c;以及缘分的可贵 1.随浪随风…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

代理IP使用的IP协议有哪些?优质的动态IP有什么特征?

一、代理IP使用的IP协议 代理IP使用的主要IP协议有三种&#xff1a;HTTP协议、SOCKS协议和FTP协议。 1. HTTP协议&#xff1a;是最常用的协议&#xff0c;通过HTTP协议传输的数据是明文&#xff0c;它可以在任意多的机器上使用&#xff0c;并且工作方式是可靠的。它是一个无状态…

Vue Echarts 多折线图只有一条X轴(合并X轴数据并去重排序) - 附完整示例

echarts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…

经验分享:构建知识库管理系统只需要这几步

导语&#xff1a; 在当今信息爆炸的时代&#xff0c;构建一个高效的知识库管理系统对于企业来说至关重要。一个好的知识库管理系统可以帮助企业集中管理和共享知识和信息&#xff0c;提高团队的协作效率和创新能力。本文将分享构建知识库管理系统的几个关键步骤&#xff0c;帮…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1&#xff09;物理备份 物理备份&#xff1a;对数据库操作系统的物理文件&#xff08;如数据文件、日志文件等&#xff09;的备份。 物理备份方法&#xff1a; 冷备份(脱机备份) &#xff1a;是在关闭数据库的时候进…

3D视觉方案的优势

随着机器视觉在工业领域的应用逐渐深入&#xff0c;传统的 2D 视觉方案已经趋向成熟&#xff0c;应用局限性也已经显现出来。 2D 视觉方案易受照明条件影响&#xff0c;一致性和稳定性难以保证&#xff0c;且无法实现三维高精度测量和定位&#xff0c; 3D 视觉方案应运而生&…

第二百三十二回

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"自定义TimePicker组件"相关的内容&#xff0c;本章回中将继续介绍该组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回…