使用qt-mingw版做的软件,发给客户以后说工作不正常,配置文件无法打开,或者加载数据文件不正常。远程查看以后,发现客户经常将程序放置在中文带空格的路径下,导致文件打开不正常。所以最近想在程序上解决一下,让客户少出问题。

首先在网上查了QT打开文件路径中含有中文和空格问题,抄了如下代码:(https://blog.csdn.net/m0_37906001/article/details/76672634)

     QString fileName=QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files(*.png *.jpg *jpeg *.bmp *.avi *.mp4)"));

     QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
std::string name = code->fromUnicode(fileName).data(); if(fileName.isEmpty())
{
return;
} inputVideo.open(name);//我准备打开的是本地视频文件

非常简单于是就加在自己代码里了:

 if(ui->bt_replay->text()=="回放")
{
auto name=QFileDialog::getOpenFileName(,"","","pcap文件(*.pcap)");
QTextCodec *code = QTextCodec::codecForName("gb2312");//解决中文路径问题
name = code->fromUnicode(name).data();
cout<<"convert gb2312:"<<name.toStdString()<<endl;
if(name!="")
{ lctrl.replay_dat(name.toStdString());
ui->bt_replay->setText("退出回放");
lctrl.replay_stat=;
ui->lb_replay_stat->setText("加载数据");
}
}

结果不行。认为是编码问题,换了编码,加了编码成功的判断,无论如何也不行,但是在网上搜到的代码都非常简单。

最后发现,QString的存储是按Unicode存的,输入的时候会把输入数据转换成Unicode,转码方式默认是Latin-1,导致转码以后的文件名又被转回去了,而且转的还不对

于是使用std::string解决这个问题:

 if(ui->bt_replay->text()=="回放")
{
auto name=QFileDialog::getOpenFileName(,"","","pcap文件(*.pcap)");
QTextCodec *code = QTextCodec::codecForName("gb2312");//解决中文路径问题
string namestd = code->fromUnicode(name).data();
cout<<"convert gb2312:"<<namestd<<endl;
if(namestd!="")
{
lctrl.replay_dat(namestd);
ui->bt_replay->setText("退出回放");
lctrl.replay_stat=;
ui->lb_replay_stat->setText("加载数据");
}
}

对于路径中存在空格的,在网上查的解决方法是:path.replace(" ","\" \"");

结果试了不行,最后发现,fopen本身就支持带空格的文件名输入,不需要转换……

QT打开文件路径中含有中文和空格问题的更多相关文章

  1. maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。

    注:本文来源于:杨四郎2018  <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...

  2. Windows文件路径转换为java中可识别的文件路径的转义方法,(另附转义多种格式)

    ps:欢迎加qq好友:2318645572,交流学习 一:路径转化 Windows中的文件路径格式为 D:\eclipse\apache-tomcat-7.0.67\wtpwebapps\... Ja ...

  3. QT 打开文件对话框汇总

    Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr( ...

  4. Qt打开文件对话框同时选中多个文件或单个文件

    Qt中打开单个文件 //str_path为文件路径 QString str_path = QFileDialog::getOpenFileName(this, tr("选择转码文件" ...

  5. Qt打开文件对话框

    项目中需要打开文件对话框,就查了一下,不得不说Qt的帮助文档做的真好,非常详细.要实现这个功能有两种方式,使用QFileDialog的静态方法,实例化QFileDialog对象. 基本算是照抄帮助文档 ...

  6. Qt打开文件QFileDialog

    //打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ...

  7. QT打开文件或文件夹或网络地址

    打开文件或文件夹 如果是文件或文件夹 必须带file:/// 后面可以是文件(夹)的绝对路径 QDesktopServices::openUrl(QUrl("file:///C:/Docum ...

  8. Qt选择文件路径

    QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./"); ...

  9. Qt获取文件路径、文件夹路径

    1.首先是选择文件 QString file_path = QFileDialog::getOpenFileName(this, "请选择文件路径...", "默认路径( ...

随机推荐

  1. JAVA基础之控制台输入输出

    ---恢复内容开始--- 输入需要用scanner机制 代码: 启用scanner机制 Scanner input = new Scanner(System.in); //String x= inpu ...

  2. [译文][转载]greenlet:轻量级并发程序

    英文原文地址:https://greenlet.readthedocs.io/en/latest/中文翻译转载地址:https://zhuanlan.zhihu.com/p/25188731 背景 g ...

  3. vue的声明式渲染

    声明式渲染 答:2018-8-23声明式渲染是vue对数据进行操作的模式,也叫做响应式渲染当dom节点上绑定了vue的对象的属性时,如果这个属性发生了改变,无需你进行其它的操作,页面上的数据会自动发生 ...

  4. 原型 - 实现自己的jQuery

    每个第一次使用jq的开发者都感到惊叹,jq的$太神奇了,究竟是怎么做到的使用$控制dom 赞叹前人之余,探究其本源才是前端开发者应该做的事,社区常常说,不要重复造轮子, 可是啊,连轮子都造不出来,又怎 ...

  5. excel 开头 结尾,中间 类似 SQL like ab% ,%ab ,%ab%

    excel  开头 结尾,中间  类似 SQL like 'ab%'  ,'%ab'  ,'%ab%' 在R2 单元格  查找   ab开头,ab结尾 =Search("ab",R ...

  6. fake_useragent 封装好user-agent的模块

    from fake_useragent import UserAgent useragent = UserAgent()print(useragent.random)

  7. 浅显易懂的Sysnchronizd用法

    <编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java线程同步中的一 ...

  8. R语言爬虫:CSS方法与XPath方法对比(代码实现)

    CSS选择器和XPath方法都是用来定位DOM树的标签,只不过两者的定位表示形式上存在一些差别: CSS 方法提取节点 library("rvest") single_table_ ...

  9. C#、C++、Java、Python 选择哪个好?

    C#.C++.Java.Python 选择哪个好? 2019年03月06日 16:54:34 编程小火车 阅读数:214   首先排除Python,光动态语言一个理由,就已经万劫不复了.无论有多少所谓 ...

  10. [原创]python写的sniffer

    import socket s=socket.socket(socket.PF_PACKET,socket.SOCK_RAW,8) while 1: data=s.recv(65535) print ...