Qt5中使用QFtp模块,解决乱码和编译器警告
Qt5中如何使用QFtp模块
QFtp模块本来在Qt4中是自带的,但升级到Qt5后,被移除了,Qt给出的替代品是QNetworkAccessManager,名字变长了不少不说,功能还变弱了(至少FTP功能变弱了),无法再使用ftp的获取列表,新建,删除,重命名…等等一系列操作,只能单纯完成文件上传下载,要想实现完全的FTP功能,还得用QFtp,在Qt5里面使用QFtp模块很多种方法,比如下载别人编好的库,或者自己编译QFtp等等,网上很多资料都介绍了,这里不赘述,最终我选择了源码直接引用到工程中,毕竟QFtp模块只有两个源文件,这样避免了很多库兼容的问题,保证100%可用。
但是QFtp毕竟是Qt4时代的产物,在Qt5中还是存在一些兼容问题的,我遇到了2个:
1.ftp中文目录乱码
2.出现运行时警告“Using QCharRef with an index pointing outside the valid range of a QString. The corresponding behavior is deprecated, and will be changed in a future version of Qt.”
下面我把解决的思路方法放上来。
ftp中文目录乱码
这个问题在网上有诸多解决方法,但是大多不奏效,有些奏效但换个编译器或者换个平台就不行了,实际上这个问题是Qt4->Qt5不同的编码规则带来的。
与其使用QFtp时修修补补,不如直接修改源码,将qftp.cpp中所有fromLatin1()替换成fromUtf8(),toLatin1()替换成toUtf8(),一切搞定。
因为Latin1可看做是Utf8的一个子集,所以这种替换是安全的。
解决“Using QCharRef with an index pointing outside the valid range of a QString”的编译器警告
这个警告的意思是错误使用了QString,[]索引超过了QString的长度,经过漫长的定位,出错的代码位于qftp.cpp,代码段如下:
QString endOfMultiLine;
endOfMultiLine[0] = '0' + replyCode[0];
endOfMultiLine[1] = '0' + replyCode[1];
endOfMultiLine[2] = '0' + replyCode[2];
endOfMultiLine[3] = QLatin1Char(' ');
显然这种写法不太讲究,使用QString前设置一下长度就好了——
QString endOfMultiLine;
endOfMultiLine.resize(4);
endOfMultiLine[0] = '0' + replyCode[0];
...
结束
如果以上内容帮助到你,请点个赞~~