Qt 通过自定义 URL Scheme 给已经运行的应用传参(Windows&macOS)

在传统的应用程序设计中,我们可以看到很多通过浏览器唤起本地应用的案例,比如百度网盘、迅雷等工具,他们在浏览器访问一个非 http/https 协议开头的地址时,会自动打开其自己的应用程序并传递一定的参数。该功能的实现方式网络上有很多示例,在 Windows 和 macOS 不同平台下他们分别需要如下设置:

继续阅读

基于 git flow + gitlab 协作开发:01 抛出问题

很久以来,我一直在寻找一个适合小型团队独立项目的 git 协同工作流。主要原因是实际工作中很难在繁忙的迭代中兼顾真正的协同和代码质量管理。造成的现象就是在一个以月维度发布版本的产品中出现各种各样的分支、hotfix。到底哪个是主线,哪个分支修复了哪些问题、不同的分支是否与主线同步更新都是未知数。如果不叫一个从开始就参与到项目中的人给你做介绍,很难去做维护。

继续阅读

Qt Quick 5.15.0 Connections 新语法

过去的 Connection 连接某个对象的信号时是这样写的:

Connections {
    target: authManager
    onError: {
        busyContainer.visible = false
        buttonJoin.enabled = Qt.binding(function () {
            return textMeetingId.length >= 11 && textNickname.length > 0
        })
        message.error(result.msg)
    }
}

新的语法中可以这样写:

Connections {
    target: authManager
    function onError(resCode, result) {
        busyContainer.visible = false
        buttonJoin.enabled = Qt.binding(function () {
            return textMeetingId.length >= 11 && textNickname.length > 0
        })
        message.error(result.msg)
    }
}

对于日常开发中,新的写法有助于我们定义槽函数的形参个数和实际作用。代码看起来更容易读懂。另外 Qt 官方文档中也介绍了一些其他好处,见:Qt官方文档

如果你使用 Qt 15.5.0 版本打开了一个旧的工程并使用的是旧的写法,那么会收到一个警告:

qrc:/qml/AnonJoinPage.qml:54:5: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }

既然是个警告,则不影响代码继续执行。但这样的警告不得不让你重写这部分代码来适配新的语法。

使用 CMake + Git Submodule 方式管理项目三方库

在项目开发过程中,避免不了要使用一些开源的三方库,我参加过的一些团队有不同的管理三方库的方式。不同的方式都各有优缺点,我们先列举一下碰到过的管理方式,说一些他们的优缺点,最后再来讨论我们今天介绍的管理方式弥补了哪些缺点。

统一管理三方库

一些团队是直接将三方库编译好放到 CI 机器上,在本地开发或者 CI 出项目的 Release 包时去做依赖拷贝。这样做有以下几点好处:

  1. 三方库不需要每次都重新编译,需要时拷贝,包括符号调试文件也可以一并维护。
  2. 大家公用一份三方库,确保三方库的出处都是一样的。

但是这样管理也有一些不足。

  1. 如果不同的项目需要依赖不同版本、不同分支的三方库,则统一的管理无法满足需求
  2. 三方库的版本管理迭代会保留诸多历史文件,一旦历史版本被清理则很难追溯历史缺陷的符号调试文件

上传三方库文件到 Git 中

编译好直接上传到项目的仓库中,这种方式有一些好处,比如:

  1. 工程下载下来不需要多余配置,启动 IDE 直接编译不废话。
  2. 自己想依赖什么版本就什么版本,不受限于其他项目

当然缺点显而易见:

  1. 静态库文件编译后非常大,上传到 Git 仓库中仓库会异常庞大,特别是三方库二进制文件的更新。
  2. 这种形式很容易出现源码和三方库文件不匹配的情况,这个项目编译好的复制到其他项目直接用,管理混乱。
  3. 跨平台项目要上传不同平台的三方库二进制文件到工程中

使用 CMake + Git Submodule 形式管理

通过以上的描述,我们已经很容易能看清楚不同的管理方式的优劣了。本文推荐的方法可以弥补一些上面方式的不足,但可能也因不同团队而异。推荐的方式大概分以下步骤。

  1. 将你需要依赖的三方库设置为 Git Submodule,每个项目可以依赖不同版本的三方库,不需要上传二进制文件。
  2. 脚本利用 CMake 自动编译三方库工程,不同平台可以使用 CMake 自动编译,不需要单独维护个别版本。
  3. CI 出 Release 时自动编译三方库并保留匹配版本的调试符号文件,和本地源码原始匹配不易混乱。

我们以一个 libyuv 三方库举例。首先将项目添加为 Git Submodule

git submodule add https://chromium.googlesource.com/libyuv/libyuv third_party/libyuv

添加完成后,我们写一个自动编译三方库的脚本,Windows 平台下使用批处理、macOS 下使用 Shell 脚本。

# Windows: Generate visual studio solution
cmake -H. -Boutput -G"Visual Studio 15 2017"
# Build release library
cmake --build output --config Release --target yuv
# Build debug library
cmake --build output --config Debug --target yuv
# macOS: Generate makefile
cmake -H. -DCMAKE_MACOSX_RPATH=OFF -DCMAKE_BUILD_TYPE=Release -Boutput -G"Unix Makefiles"
# Static library
cmake --build output --target yuv

这样在不同平台我们就可以自动编译三方库二进制文件了,本地开发时只需要将 Submodules 更新下来,头文件和库文件路径都修改为三方库文件的路径。CI 出 Release 包时也是先将 Submodules 更新下来编译后再编译项目主体。

Qt Quick Windows 下实现无边框窗口阴影效果

Qt Quick 中实现一个无边框窗口阴影效果的中心思想是将 Window 容器背景设置为透明的,在 Windows 容器中添加一个填满窗口的容器(如 Page、Rectangle 等),然后将这个容器设置一些边距,再给这个容器附加一个阴影效果,实现的效果如下:

继续阅读

Qt QML qtquickcontrols2.conf 使用系统未安装的自定义字体

现在很多视觉设计最终给出的字体可能并不是所有系统都安装过的,所以项目中可能需要单独把字体文件打包进去在程序运行的时候加载。Qt QML 有多种方式加载一个自定义字体,本文将介绍所有我知道的方式,大家根据自己的需要选择使用任意一种即可。

继续阅读

2020 新的开始

2019 年是“进展缓慢”的一年,也是我人生中具有重要意义的一年,更是在经历了诸多波折后回到人生正常状态的一年。虽然还有很多遗憾(包括家庭、感情、工作),但我还是要感谢这一年所有遇到过的人和经历过的事情,这些都无形中让我慢慢走向一个三十而立的人。

我将原有的个人博客域名指向了这个站点,这也意味着未来只会维护这一个博客,这里会有我成长所有相关的内容。按照惯例,总结过去一年的得失,对未来做一个展望。人总是要前进,在前进的道路上才能发现生活的意义。

继续阅读

递归修改当前目录 .cpp、.h、.md 文件为 UTF8 或 UTF8-BOM 格式

有些代码目录下的文件格式不同,会导致一些编译错误或者中文出现错误等等问题,下面脚本就是解决这个问题而生的。使用 Autoit3 编译脚本后放到你要转换的目录中,运行脚本会转换所有 .cpp、.h、.md 文件为 UTF8 格式,如果你希望修改成 UTF8-BOM 格式,可以将 $FO_UTF8_NOBOM 修改为 $FO_UTF8

继续阅读