QT开发采坑记录(2023-4.15更新)

QT,显然不是完美的,很多或大或小的bug,新版本不停发布,也不解决问题,让人无语

我用的版本是5.14.2,本文列举的很多坑,新版也没有解决。

先写一下印象深刻的,其余的想到了再慢慢整理,方便自己查询,也方便别人避坑:


1. 文件xxx.exe.lnk,这种双扩展名的快捷方式文件,在windows下,如果使用QFileInfo,则exists方法会检测不到文件存在,QFile::rename方法,也会失败。

解决方法在windows平台下采用系统api

2. MVC方式的QListView控件,model的removeRow方法,并不会清空对应item的data

解决方法: clearItemData,主动调用清理


3. QImage,在ubuntu下,如果图像文件的扩展名和真正格式不对应,则无法加载

解决方法写一个方法,根据图像文件内容头部检测图像文件真正格式,然后重名名为真正的格式。或者根据文件内容加载QImage


4. QT内置的QNetworkRequest,如果要断点续传,调用request.setRawHeader("Range", nRange),  如果已经是nRange是已经下载的大小,则不会发生finish信号

解决方法将nRange适当减小一下


5. QListWidget,输入法焦点问题,如果界面上有QListWidget和QTextEdit控件,QTextEdit调出中文输入法正在进行输入,这时如果代码调用了QListWidget控件的takeitem,则QTextEdit中的中文输入法会消失,输入内容也会被清除,这个坑非常巨大

注:不是只有takeitem会有问题,只要是涉及到删除item的方法,比如clear,都会有问题

解决方法:修改qt源码或者更换QListWidget为MVC方式的QListView

6. QT内置的xml库,QDom只支持具有明显开头标志和结尾标志的节点,不支持单名称节点,比如<node/>这种

解决方法:矫正xml或者换库

7. QT内置的TCPSocket默认缓冲区太小,导致数据丢失

解决方法:setSocketOption,设置缓冲区大小

8. QCombobox可能无法支持样式,比如下拉箭头

解决方法:给控件设置ItemDelagate

9. QImage不支持乱码文件名,比如这种:E~J$%0A[3YPI6YP%7DEO4KZJG,会加载失败

解决方法:重命名文件

10. QWebEngineView如果调用SetHmtl加载html ,则html中的跳转事件acceptNavigationRequest不发生

解决方法: 采用load url本地文件方式

11. QMediaPlayer在windows平台很完美,但在某些linux平台上无法播放音频或者无法同时播放

解决方法:采用SDL播放

12. windows平台,设置了IE代理的情况下,QTCPScoket和QWebEngineView都会首先连接IE的代理,如果代理失效,则会连接非常慢

解决方法:调用对应方法,设置不使用系统代理

13. windows平台,原因未知的情况下,QT封装的剪贴板会失效,错误提示:OleSetClipboard: Failed to set mime data (text/plain) on clipboard: COM error 0x800401f0

这个错误似乎只发生于win10,怀疑是win10的bug

解决方法:自己用api封装剪贴板操作

14. QT内置的http功能,使用使用QNetworkAccessManager时,某些windows系统上,莫名的网络错误,错误代码99,UnknownNetworkError,查看日志,显示:QIODevice::read (QDisabledNetworkReply): device not open

解决方法:_netAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

15. QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); 获取应用的系统可写路径,在Linux上,如果在QApplication对象定义之前使用,返回"/home/用户名/.local/share"目录,如果在之后使用,则返回"/home/用户名/.local/share/程序名称"目录。

16. url编码过的网址在QTextBrowser超链接点击信号中处理时,获取到传递的值会有问题,原本url编码的%2F会变成14F,原因未知。

解决方法:将url用base64编码后传递,在信号处理中恢复。

17. QT内置sqlite,支持三种数据刷新到磁盘设置,但是在设置PRAGMA synchronous = FULL或者WAL模式时,在某些电脑上特别慢(win7、win10都会发生,不确定是不是和360有关),插入一条数据需要10秒左右,只能设置为OFF模式,但是OFF模式又不安全,这就很尴尬了。

建议非必要情形下,不使用QT的内置sqlite。

18. QT内置的http功能,下载速度过快时,会卡死主程序,即使采用了异步下载。

解决方法:QNetworkReply对象指定合适的缓存大小(setReadBufferSize)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值