《QDebug 2023年4月》

一、Qt Widgets 问题交流

二、Qt Quick 问题交流

1.Qt Creator 10.0.0 版本创建 Qt Quick 项目时没有 Qt5 和 qmake 选项

在线更新 Qt Creator 到 10.0 版本后,除了一堆 BUG,还有个很坑爹的问题,创建 Qt Quick 项目的模板移除了 Qt5 和 qmake 的支持。好在 Qt Creator 的项目模板是可以编译的,可以拿旧版本的 Qt Quick 项目模板放进去。

我浏览 Qt Creator 在 git 上的代码是有 qtquickapplication_compat 这个模板的,支持 Qt5 和 qmake,但是 10.0.0 安装版里没有提供。(2023 年 5 月 6 日补充:这个老六隔了一个月又更新了一个小版本 Qt Creator 10.0.1,把 compat 模板又加到了安装包里 )

Qt Creator git:https://github.com/qt-creator/qt-creator

代码库中 compat 模板路径: 

qt-creator\share\qtcreator\templates\wizards\projects\qtquickapplication_compat

我们拿到模板后,如果是在线安装的 Qt Creator ,放到:

Qt\Tools\QtCreator\share\qtcreator\templates\wizards\projects

这时重新打开 Qt Creator 就能使用 compat 这个模板了。

2.对 qml 基本类型 list 的编辑

在 Qt5 中,QML 的 list 类型只提供了 push 添加数据,或者重新赋值,没法 pop。到了 Qt6,实测可以对 list 调用 pop/shift 等操作。

Qt5 中可以先将 list 转为 js 的数组,编辑完后再重新赋值回去,以 ShapePath 为例:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Shapes 1.15
import QtQuick.Controls 2.15

Window {
    id: root
    width: 640
    height: 480
    visible: true
    title: qsTr("Test Qml list")

    Shape {
        id: shape
        anchors.fill: parent
        ShapePath {
            id: shape_path
            strokeColor: "black"
            strokeWidth: 6
            fillColor: "transparent"
            capStyle: ShapePath.RoundCap

            property int joinStyleIndex: 2
            joinStyle: ShapePath.RoundJoin

            startX: 30
            startY: 30
            pathElements: [
                PathLine { x: 30; y: 30
                    Component.onCompleted: {
                        console.log("init item")
                    }
                    Component.onDestruction: {
                        console.log("free item")
                    }
                },
                PathLine { x: 100; y: 30 },
                PathLine { x: 30; y: 100 },
                PathLine { x: 100; y: 100 }
            ]
        }
    }

    Button {
        anchors.centerIn: parent
        text: "pop"
        onClicked: {
            console.log("len =", shape_path.pathElements.length)
            if (shape_path.pathElements.length <= 2)
                return;
            // Qt6 版本
            //let item = shape_path.pathElements.shift()
            // Qt5 版本
            let path = Array.from(shape_path.pathElements)
            let item = path.shift()
            shape_path.pathElements = path
            // 不主动释放只会在结束时释放,主动调用 destroy 不会触发 Component.onDestruction
            item.destroy()
            shape_path.startX = shape_path.pathElements[0].x
            shape_path.startY = shape_path.pathElements[0].y
        }
    }
}

三、其他

1.在 Windows 上设置开机启动遇到的路径问题

如果是通过注册表的形式设置程序开机启动,如:

HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

那么程序的工作目录(working directory)就会在系统路径下,相当于命令行在别的目录启动一个程序。此时如果读写文件是相对于当前工作路径就可以能找不到文件,可以用 QCoreApplication::applicationDirPath() (即 exe 的相对路径)来拼接绝对路径,而不是直接 ./ 的形式,也可以设置:

QDir::setCurrent(QCoreApplication::applicationDirPath());

此外我们在程序中可能还要启动一些进程,可以将 exe 的目录设置为工作目录,而不是直接继承当前的环境,否则可能报错找不到依赖库或者 plugin。如果是 QProcess 的话,接口如下:

QProcess p;
p.setWorkingDirectory(QCoreApplication::applicationDirPath());

QProcess::startDetached(program, arguments, QCoreApplication::applicationDirPath());

2.Mac 上使用 QtCreator qmake 编译,报错提示 SDK 版本过高

参考:https://blog.csdn.net/qq_35664104/article/details/121480884

之前在 MacOS 10.14 上使用 Qt5.15 + XCode 正常,在 MacOS 12 上下载了对应版本的 XCode 后用 Qt5.15 qmake 编译就报错。

在 pro 中加上一些设置:

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.15 // 使用对应版本SDK
CONFIG += sdk_no_version_check // 忽略版本检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值