使用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. c++string标准输入和getline()整行读入

    1.使用标准IO操作读写string对象 我们都知道,使用标准iostream操作来读写int ,double等内置类型的值,同样,我们也可以使用IO操作来读写string对象. c++ code: ...

  2. Mac连接Linux服务器

    1.终端命令 a).打开Mac的命令终端 b).输入ssh -p 22 root@101.200.86.233 它会提示你输入密码,输入正确的密码之后,你就发现已经登陆成功了.(22: 端口号 roo ...

  3. percona数据库监控工具的安装部署

    Percona Monitoring and Management 安装 PMM是一个开源,免费的mysql管理监控平台,他可以用来分析mysql,mariadb和mongodb的服务器性能. 安装步 ...

  4. 09JavaScript函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 实例1: <!DOCTYPE html> <html> <head> <meta charset ...

  5. Java并发编程:浅析几种线程安全模型 [转]

    多线程编程一直是老生常谈的问题,在Java中,随着JDK的逐渐发展,JDK提供给我们的并发模型也越来越多,本文摘取三例使用不同原理的模型,分析其大致原理.目录如下: 1.COW之CopyOnWrite ...

  6. oracle 用户尝试登录失败锁定策略及修改

    -- 修改密码的有效期策略, 永不过期SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;Profile altered ...

  7. 【Keil】Keil5的安装和破...

    档案的话网上很多的,另外要看你开发的是哪种内核的芯片 如果是STC的,就安装C51 如果是STM的,就安装MDK 当然市面上有很多芯片的,我也没用过那么多种,这里也就不列举了 至于注册机,就是...恩 ...

  8. 用kubeadm构建k8s集群部署

    一.环境 三台centos机器 二.软件及容器准备 1.安装docker环境 本例安装 docker-ce版本,repo源为docker-ce.repo文件,拷贝到 /etc/yum.repos.d下 ...

  9. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  10. go学习笔记-标准库

    标准库 名称 摘要 archive tar tar包实现了tar格式压缩文件的存取. zip zip包提供了zip档案文件的读写服务. bufio bufio 包实现了带缓存的I/O操作. built ...