qt下实现文件的拖拽打开

引言

此文用于记录按下鼠标左键不放,拖动文件到程序中打开。该示例中只设置了可以拖动的文件类型为.h,.cpp,.txt这三种文件类型。

程序运行的效果:

在这里插入图片描述

示例

下面是具体的实现。
项目的结构:
在这里插入图片描述
具体的实现代码,如下:
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>/********************************************======功能描述:=======1.实现文件的拖拽打开。
********************************************/QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();
protected:void dragEnterEvent(QDragEnterEvent *event);//拖拽进入void dropEvent(QDropEvent *event);//释放拖拽的文件QString GetCorrectUnicode(const QByteArray &ba);//返回ba的UTF-8编码的QString字符串
private:Ui::Dialog *ui;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFile>
#include <QTextCodec>
#include <QDebug>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);setAcceptDrops(true);ui->textEdit->setAcceptDrops(false);//设置不接收拖拽事件,否则会进入该子控件的拖拽事件中
}Dialog::~Dialog()
{delete ui;
}void Dialog::dragEnterEvent(QDragEnterEvent *event)
{if (event->mimeData()->hasUrls()) {event->acceptProposedAction();}else {event->ignore();}
}void Dialog::dropEvent(QDropEvent *event)
{if (event->mimeData()->hasUrls() && (event->mimeData()->urls()[0].fileName().right(3).compare("cpp") == 0|| event->mimeData()->urls()[0].fileName().right(3).compare("txt") == 0|| event->mimeData()->urls()[0].fileName().right(1).compare("h") == 0)) {const QList<QUrl> urls = event->mimeData()->urls();QString filePath = urls.at(0).toLocalFile();QFile file(filePath);if (file.open(QIODevice::ReadOnly)) {QByteArray byteArray = file.readAll();QString strContent = GetCorrectUnicode(byteArray);//返回utf-8编码的字符串QString
//            QString strContent = QString::fromLocal8Bit(byteArray).toUtf8();//当文件的编码格式为GB2312编码,采用这种方式不乱码
//            QString strContent = byteArray;//当文件本身的编码格式为utf-8时,采用这种方式不乱码ui->textEdit->setText(strContent);}else {qDebug()<<QStringLiteral("文件")<<filePath<<QStringLiteral("打不开");}}
}QString Dialog::GetCorrectUnicode(const QByteArray &ba)
{QTextCodec::ConverterState state;QTextCodec *codec = QTextCodec::codecForName("UTF-8");codec->toUnicode( ba.constData(), ba.size(), &state);if (state.invalidChars > 0){return QTextCodec::codecForName( "GBK" )->toUnicode(ba);}else{return ba;}
}

ui文件的结构
在这里插入图片描述
以上便是文件拖拽打开的实现。
值得注意的是:
1.文件txt,.cpp,.h可能会以不同的编码格式保存,这里函数GetCorrectUnicode(const QByteArray &ba)可以将字符串转换为Utf-8编码的QString字符串。所以无论是那种格式应该都可以正常的拖拽加载到显示文本中。
2.对于单一的编码格式保存的文件,可以单一处理。当文件的编码格式为utf-8时,可以直接将从文件中读取的内容设置到显示文本。如:

 QByteArray byteArray = file.readAll();QString strContent = byteArray;//当文件本身的编码格式为utf-8时,采用这种方式含中文不乱码。

当文件保存的编码格式为gb2312时,这时可以这样处理:

QByteArray byteArray = file.readAll();
QString strContent = QString::fromLocal8Bit(byteArray).toUtf8();//当文件的编码格式为GB2312编码,采用这种方式不乱码

可以看出还是采用将编码格式统一转换为utf-8比较方便,这样就不用区分文件保存时的编码格式了。
3.对于文件拖拽,首先改类必须能够接收拖拽,也就是必须在构造函数中设置setAcceptDrops(true);其次改类的子控件必须设置为不接受拖拽,这样当事件到来的时候,改类被重写的拖拽事件便会去处理。如果子控件没有设置不接受拖拽,那么拖拽事件会直接在子控件的拖拽事件中处理。

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

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

相关文章

Java并行流 No thread-bound request found

异常如下&#xff1a; java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operati…

qt中使用QCompleter实现查找功能

引言 本文有两个例子&#xff0c;示例一中通过在combox中输入文本可以实现自动补全&#xff0c;用户根据提示列表&#xff0c;选中某一个信息&#xff0c;作为要搜索的字符串。示例二中用户输入要搜索的文本在行编辑器中&#xff0c;当输入的文本在搜索的字符串列表中时&#…

动图:程序员才懂的这些!

戳蓝字“CSDN云计算”关注我们哦&#xff01;1. Java VS C2. 功能先上了再说3.高级开发人员作为一个团队进行编程4. 调试CSS5. 编译错误&#xff1a;括号不匹配6.高级开发人员重构代码7. 看实习生编码的时候&#xff0c;我的表情...8.当我尝试进入BIOS9. 虽然很多Bug&#xff0…

MyBatisPlus_查询篇_入门试炼_01

文章目录1、数据库 Schema 脚本如下&#xff1a;2、数据库 Data 脚本&#xff1a;3. 实战现有一张 User 表&#xff0c;其表结构如下&#xff1a;idnameageemail1Jone18test1gblfy.com2Jack20test2gblfy.com3Sandy28test3gblfy.com4Jone21test4gblfy.com5Billie24test5gblfy.co…

表达祝福与喜悦的数字资产——平安夜的特别礼物华为云DAC

平安夜的街灯光闪烁&#xff0c;人们沉浸在节日气氛中&#xff0c;忙着购买礼物&#xff0c;准备晚餐&#xff0c;相互传递感恩与祝愿。华为云DAC数字资产创意平台锁住美好&#xff0c;用数字艺术的形式制作专属节日记忆&#xff0c;有创意的礼物总让人难忘。 独一无二的礼物—…

qt生成无ui界面动态库,有ui界面的动态库,以及含有资源文件和qss文件的动态库

提要 此文分别就qt生成纯代码的动态库&#xff0c;含有ui文件的动态库以及含有资源文件qss文件和切图的动态库。 实现 1.纯代码的生成qt库。即没有ui文件的项目。 打开QtCreate&#xff0c;新建文件&#xff0c;选择library. 接下来填写项目的名称&#xff0c;选择生成的路…

太形象了!什么是边缘计算?最有趣的解释没有之一!

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;云计算就像是天上的云&#xff0c;看得见摸不着&#xff0c;像章鱼的大脑&#xff0c;…

qt中使窗口的大小随窗口的内容大小进行调整

提要 窗口用于显示文本信息&#xff0c;当窗口的文本信息变长&#xff0c;原有窗口的大小不足以显示文本信息。这时就需要一个能够根据窗口要显示的文本信息的长度来调整窗口大小的窗口。 示例 效果图&#xff1a; 窗口内容少的时候提示窗口大小&#xff0c;当窗口要显示的…

MyBatisPlus_查询分页篇_入门试炼_02

文章目录1. mapper接口2. 映射文件3. 实战分页1. mapper接口 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.…

看完这篇买车不用坐引擎盖哭啦

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;Kying转自&#xff1a;数据森麟作者介绍&#xff1a;Kying&#xff0…

Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上

提要 当程序关闭后再次打开程序需要加载上一次的按钮名称设置。 思路 关闭程序的时候保存此刻界面按钮的文本&#xff0c;正常情况下只需在程序退出时调用的析构函数的内部实现&#xff0c;将界面所有的按钮文本生成一个文件&#xff0c;在程序下一次启动的时候&#xff0c;…

MyBatis-Plus_快速入门0222

文章目录一、配置1.1、Spring Boot 工程&#xff1a;配置 MapperScan 注解1.2 Spring MVC 工程&#xff1a;配置 MapperScan1.2.1 调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory一、配置 MyBatis-Plus 的配置异常的简单&#xff0c;我们仅需要一些简单的配置即…

什么是云计算基础设施? | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;云计算基础设施是内部系统和公共云之间的软件和硬件层&#xff0c;其融合了许多不同的…

如何将本地代码推送至远程仓库_命令简化版本

如何将本地代码推送至远程仓库&#xff1f; 文章目录一、新仓库1. 初始化README.md2. 初始化Git仓库3. 将工作区的代码添加至暂存区4. 将暂存区的变更文件提交到本地仓库5. 将本地仓库和远程仓库建立连接6. 将本地代码push至远程仓库7. 先拉去代码&#xff0c;在push8. 强制推送…

K8S精华问答 | Kubernetes用的是Docker的容器?

kubernetes&#xff0c;简称K8s&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;目标是让部署容器化的应用简单并且高,并提供了应用部署&#xff0c;规划&#xff0c;更新&#xff0c;维护的一种机制。今天&#xff0c;我们就来看看…

qt中生成含有中文的json文件和解析json文件

提要 生成的json文件在程序加载解析时出现上述错误&#xff0c;究其原因是生成json文件过程中编码问题。qt编译器默认的编码格式为utf-8&#xff0c;而windows一般为gbk编码&#xff0c;所以就需要在生成本地json文件的时候将utf-8编码转换为gbk编码。读取json文件的时候&…

MyBatis-Plus_断言

MyBatis-Plus 之断言 文章目录1. 断言代码&#xff1a;2. 源码&#xff1a;3. 释义&#xff1a;4. 举个栗子&#xff1a;5. 异常信息&#xff1a;6. 控制台输出定位7. 查看数据库&#xff1a;1. 断言代码&#xff1a; Assert.assertEquals(5, userList.size());2. 源码&#x…

Twitter 宣布抛弃 Mesos,转向 Kubernetes;全球关键5G专利我国占34%;华为面试要改革?...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go2019伯克希尔股东大会&#x…

qt鼠标进入窗体后,窗体自动置顶

提要 鼠标进入窗体后&#xff0c;窗体自动置顶&#xff0c;鼠标移开窗体后&#xff0c;窗体恢复之前的状态。 示例 运行效果如下&#xff1a; 程序刚启动的效果如下&#xff1a; 鼠标放在某一个窗口上的效果如下&#xff1a; 可实现鼠标放在某一个窗口上该窗口置顶&#x…

MyBatis-Plus_入门试炼03

排除非表字段的3种方式 常见编程场景&#xff1a; 实体类中某个变量不对应数据库的表中的任何字段&#xff0c;用于暂时保存临时数据或者通过某种方式计算或组装的数据。 文章目录一、举个栗子&#xff1a;1.1 在User实体类中&#xff0c;添加remark属性1.2 执行插入操作&#…