• 《QDebug 2022年6月》


    一、Qt Widgets 问题交流

    二、Qt Quick 问题交流

    1.QML程序在某些显卡上不能正常启动 

    环境:Window10  MSVC2019  Qt5.15.2-64bit(更低的版本也会)

    现象:笔记本+扩展屏有两个屏幕,Windows 设置的主屏上可以正常显示 QML 的 Window 窗口,辅屏上则会在启动时卡死(一个黑色或者白色的窗口卡死在那里;默认操作焦点在哪个屏幕就会在哪个屏幕弹出窗口,所以程序拖到对应屏幕下启动即可)。禁用掉笔记本自带的集成显卡后,在主屏和辅屏都能正常启动了。

    后来得知 Qt 可以设置显卡黑名单。Qt Quick 应用 OpenGL 实现的顺序本来是 desktop,angle,software,要使用 Qt Quick 2 工作需要提供 OpenGL2.1 及以上的版本,这就需要禁用掉一些对  OpenGL 支持有问题的显卡,然后使用 angle 或者 software 。

    Qt 文档:https://doc.qt.io/qt-5/windows-requirements.html

    我的 Demo:https://github.com/gongjianbo/MyTestCode2021/tree/master/Qml/OpenGLBlackList

    将有问题的显卡信息写入到一个 json 文件中,然后在环境变量 QT_OPENGL_BUGLIST 指定 json 文件的路径(为了方便我这里用的资源文件路径):

    1. {
    2. "name": "Qt built-in GPU driver blacklist",
    3. "version": "5.14",
    4. "entries": [
    5. {
    6. "id": 1,
    7. "description": "Intel(R) UHD Graphics",
    8. "vendor_id": "0x8086",
    9. "device_id": ["0x9ba4"],
    10. "os": {
    11. "type": "win"
    12. },
    13. "features": [
    14. "disable_desktopgl"
    15. ]
    16. }
    17. ]
    18. }
    1. int main(int argc, char *argv[])
    2. {
    3. qputenv("QT_OPENGL_BUGLIST", ":/opengl-blacklist.json");
    4. QGuiApplication app(argc, argv);
    5. ... ...
    6. return app.exec();
    7. }

    设置中对该类型的显卡禁用了 desktop opengl,会去尝试 angle 和 software 的实现。

    json 文件每个显卡主要区分两个参数,厂商 id 和设备 id,可以从 Windows 设备管理器中查看,这个 VEN 后面的四个十六进制数字就是厂商 id, DEV 后面的四个十六进制数字就是设备 id:

      

    可能不兼容的显卡有很多种,遇到了就更新到黑名单里。

    2.QML FileDialog取到的url路径格式化为本地路径

    QML 的 FileDialog 获取到的文件或者目录路径是 url 格式的,除了路径前面会以 "file:///" 开头,还会转义 #%^{} 等特殊符号。

    Qt C++ 的 QUrl 类提供了两个接口用于 url 与本地路径格式的转换:

    1. //url转为本地路径
    2. QString QUrl::toLocalFile() const
    3. //根据本地路径生成url
    4. QUrl QUrl::fromLocalFile(const QString &localFile) //static

    三、其他

    1.QString去除空白符

    1. QString str=" a b\t\tc\n\nd ";
    2. //去除任意空白符
    3. str.remove(QRegularExpression("\\s")); //"abcd"
    4. str.remove(QRegExp("\\s")); //"abcd"
    5. //去除头部空白
    6. str.remove(QRegExp("^ +\\s*")); //"a b\t\tc\n\nd "
    7. //去除尾部空白
    8. str.remove(QRegExp("\\s* +$")); //" a b\t\tc\n\nd"
    9. //去除两侧空白
    10. str=str.trimmed(); //"a b\t\tc\n\nd"
    11. //去除两侧空白,并将内部空白替换为单个空格
    12. str=str.simplified(); //"a b c d"
    13. qDebug()<<str;

    2.FTH: (数字): ***Fault tolerant heap shim applied to current process. This is usually due toprevious crashes. ***

    微软文档:https://docs.microsoft.com/en-us/windows/win32/win7appqual/fault-tolerant-heap

    Qt Creator 中运行程序时出现该错误提示,很可能是之前运行时崩溃过。出现该错误提示后需要修改注册表去设置下,不然每次运行都提示这个错误。

    参考微软文档,容错堆(Fault Tolerant Heap,FTH) 是 Windows 7 的一个子系统,负责监视应用程序崩溃并自主应用缓解措施,以防止将来在每个应用程序上发生崩溃。但没发现有什么具体用处,该崩溃还是会崩溃。

    首先找到注册表的 FTH 设置:

    计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FTH

    将 Enabled 一项从 1 设置为 0(我还顺便把 FTH/State 目录下和程序名一样的一条信息删除了)

    文档说设置完后重启电脑,FTH 将不再为新应用程序激活(但实测不重启也没遇到什么问题)

    设置完后执行 CMD 命令清除所有的 FTH 应用程序记录:

    Rundll32.exe fthsvc.dll,FthSysprepSpecialize

  • 相关阅读:
    美国海运价格,美国专线直达怎么收费?
    Mysql安装 终端配置 navicat连接
    java删除临时文件夹,java删除文件夹,java删除文件
    用HTML、CSS和JS打造绚丽的雪花飘落效果
    Linux中的添加一块新的硬盘
    React useState和useEffect
    重走JAVA之类与对象相关的
    平年,闰年 质数 有效日期
    [附源码]java毕业设计放肆游旅游网
    electron vue 模仿qq登录界面
  • 原文地址:https://blog.csdn.net/gongjianbo1992/article/details/125400723