Qt 6.10 现已发布,为应用程序开发人员和设备制造商带来全新功能和改进!
UI 构建工具的亮点包括 Qt Quick 新增的 Flexbox 布局系统,以及支持更多 SVG 和Lottie 格式的矢量动画。根据用户反馈,大幅简化 C++ 代码与 QML 开发的 Qt Quick UI 之间的数据交互。这些数据现在可与全新的 SearchField 控件配合使用,或应用于Qt Graphs 模块新推出的 FilledSurface 三维曲面图。
如果您希望保留现有代码库,升级到 Qt 6.10 可确保应用程序自动适配桌面和移动平台上的高对比度系统设置。这项改进连同无障碍功能方面的其他优化,将直接惠及依赖辅助技术的用户——无需额外开发工作即可提升可用性与包容性。
除上述亮点外,Qt 各模块中的新 API 为 QML 和 C++ 开发人员以及 Qt Widgets 和 Qt Quick 用户带来了更高的灵活性和开发效率。
视频包含此版本更新的功能亮点:
高对比度模式已成为各大操作系统提高视觉清晰度和可用性的关键功能。随着 Qt 6.10 的发布,我们将内置样式与特定平台的对比度设置保持同步。这将使您的应用程序在视觉上与整体用户体验保持一致,并让更多用户能够使用。此外,可更轻松地遵守各种无障碍法案。
请阅读Oliver的博客,了解更多关于不同的内置样式中支持高对比度模式的更多信息。
我们还审查并改进了 Qt 部件和 Quick 控件在屏幕阅读器等辅助技术客户端上的显示方式,并改进了与底层平台的集成,尤其是 WebAssembly 平台。其中许多改进也将包含在即将发布的 LTS 分支的后续补丁版本中,请保持版本更新。
Qt Quick 持续演进并拥抱新技术,以支持更快的开发和迭代。Qt 6.10 带来了新的方式,通过新增的 Quick Control 使您的 UI 响应更迅速、外观更现代,并减少自定义代码量。
Qt 长期以来提供各种布局类型,可在用户界面中自动排列用户界面组件。Qt 提供的布局尤其适合创建响应式和可调整尺寸的界面,这对于需要在不同平台、各种屏幕尺寸和纵横比上运行的用户界面构建非常理想。这还使构建单一用户界面成为可能,该界面可适配不同语言文本长度的翻译,或满足用户对不同字体大小的偏好。
在 Qt 6.10 带来了一项新特性 —— FlexboxLayout 类型,它加入了 现有的 Qt Quick 布局体系。Qt 的 FlexboxLayout 不仅提供了类似 CSS's Flexible Box Layout 的功能,还与 Qt Quick 原有的布局机制紧密融合,例如通过附加属性配置布局中单个子项的行为方式。
FlexboxLayout 目前处于技术预览阶段 ,我们期待您对实现方式和 API 设计的反馈。我们设计该类型旨在特别快速简便地创建响应式用户界面,同时保持运行时性能。在过去的几个版本中,我们稳步改进了Qt Quick scene graph和Qt Quick Shapes模块对矢量图形的支持,以及 Qt 处理 SVG 图像的能力。在Qt 6.8中,我们引入了VectorImage 元素和svgtoqml 工具,这两个工具都能轻松将矢量图形内容直接导入 Qt Quick scene graph。
Qt 6.10 新增了对动画矢量图形的支持,可处理 SVG 或 Lottie 格式的图像。对 Lottie 文件的支持整体得到提升,Qt Lottie 模块现在能支持更广泛的现代 Lottie 文件 。通过 VectorImage 类型直接支持 Lottie,您现在可以将 Lottie 文件渲染为可缩放和硬件加速的矢量图形。
更多详情,请阅读Eskil的博客。
新的 SearchField 控件是一种专为搜索功能设计的输入框。与所有 Qt Quick 控件一样,它为各种内置样式提供了实现方案,并在所有主流平台上提供原生外观体验。
SearchField {
id: colorSearch
suggestionModel: colorFilter
anchors.horizontalCenter: parent.horizontalCenter
}
SearchField 会在弹出窗口中显示模型中的相关数据,这些数据会根据输入框内键入的文本进行筛选。模型数据可由任何现有的 QML 数据获取机制提供,同时我们还新增了多项改进, 以便在 C++ 后端代码和用 QML 编写的 Qt Quick UIs 代码之间交换数据。
长期以来,将 C++数据模型集成到 QML 和 Qt Quick UI 中一直是构建 Qt 应用程序的强大功能,但有时也较为复杂。Qt提供了多种机制(如单例对象、QAbstractItemModel、上下文属性和基于QObject的绑定)来弥合后端逻辑与前端表现之间的差距。然而,构建完整且高效的双向集成往往需要编写大量样板代码。
根据用户反馈,我们一直在努力简化这一过程,使其更加直观。以下是近期改进的一些亮点,这些改进使 C++ 和 QML 的连接更顺畅、更高效、对开发者更友好。
Qt 6.10 中的一个新类是 QRangeModel,这是一个轻量级、多功能的 QAbstractItemModel实现,旨在将C++范围(如 std::vector 、 std::array 或任何可迭代容器)直接暴露给 Widgets 中的 item 视图,以及 QML 和 Qt Quick 视图。无论数据是像整数这样的简单值,还是由Q_GADGET 或 std::tuples 等更复杂的类型组成, QRangeModel 都会自动生成适当的角色,并使得数据在委托中可访问,而无需编写样板模型代码。例如,可以将 std::vector<int> 封装在 QRangeModel 中,并在 Qt Widgets UI 中这样使用:
std::vector<int> values = {1, 2, 3, 4, 5};
auto model = new QRangeModel(values);
QListView *listView = new QListView;
listView->setModel(model);
当与小工具一起使用时,QRangeModel 会自动将每个属性作为已命名的角色公开,允许 QML委托使用通过 required 属性与它们绑定。例如,考虑一个代表标签值的小工具:
struct LabeledValue {
Q_GADGET
Q_PROPERTY(int value MEMBER value)
Q_PROPERTY(QString label MEMBER label)
public:
int value;
QString label;
};
您可以像这样从 std::vector 创建模型:
std::vector<LabeledValue> data = {
{1, "One"}, {2, "Two"}, {3, "Three"}
};
auto labeledValues = new QRangeModel(data);
在 QML 中,您可以在委托中使用必需属性 (required properties),以类型安全的方式绑定到模型角色:
ListView {
model: modelProvider.labeledValues
delegate:Item {
required property int value
required property string label
width: ListView.view.width
height: 40
Text {
anchors.centerIn: parent
text: label + " (" + value + ")"
}
}
}
这种模式无需手动处理角色或上下文属性,可与编译后的 QML 无缝协作。这为现代 C++与 QML 的对接提供了便捷途径,而无需任何 QAbstractItemModel 的模板实现。
有关 QRangeModel 的所有详细信息,请阅读此博客和 API 参考文档。
到目前为止,要从委托中写入模型,要么需要 model 对象并通过该对象写入,要么使用上下文属性 (context properties) 而不是必需属性 (required properties)。
ListView {
delegate:TextInput {
required property QtObject model
text: model.label
onEditingFinished: model.label = text
}
}
虽然这种方法可行,但它不符合使用必填属性 (required properties)将模型数据传输给委托的建议。在 Qt 6.10 中,如果将视图的新 delegateModelAccess 属性设置为 DelegateModel.ReadWrite,就可以将必填属性写入模型。
ListView {
delegateModelAccess:DelegateModel.ReadWrite
delegate:TextInput {
required property string label
text: label
onEditingFinished: label = text
}
}
这适用于Qt提供的所有视图:Instantiator、Repeater、ListView、GridView、TableView、TreeView、MapItemView 和 Repeater3D。
人们经常需要双向或多同步绑定。Qt 6.10 引入了 Synchronizer 元素。通过 Synchronizer,您可以确保多个属性尽可能保持相同的值,同时又不会破坏其中任何一个属性的绑定。在使用 Synchronizer 之前,您通常需要一个绑定和一个信号处理器才能将控件同步到模型值,而且这只适用于用 C++ 实现的控件。
delegate: Row {
id: delegate
required property int value
required property string label
SpinBox {
value: delegate.value
// Extra signal, only for input
onValueModified: delegate.value = value
}
Text { text: delegate.label }
}
使用 Synchronizer,你只需要一个元素来执行同步,它可以同步任意数量的属性,且目标既可以用 C++也可以用 QML 实现。
delegate: Row {
id: delegate
required property int value
required property string label
SpinBox {
Synchronizer on value {
property alias source: delegate.value
}
}
Text { text: delegate.label }
}
Synchronizer 目前处于技术预览阶段。您可以在 Qt.labs.synchronizer 模块中找到它。
迄今为止,要在 Qt Quick UI 中使用树数据 (tree data),需要实现 QAbstractItemModel。通过 QRangeModel,现在可以更轻松地将 C++中的树数据结构暴露给 Qt Quick UI, 而无需从头开始实现整个模型,但在 C++ 中实现这样的数据结构仍是一项艰巨的工作。对于许多用例、较小的数据集和用户界面原型,直接在 QML 中声明树形数据结构就足够了。
借助 Qt 6.10 中新的 TreeModel QML 类型,就可以很容易地在 Qt 中直接以内联 QML 文档的形式声明树形数据结构,并使用熟悉的 JSON 数组和字典语法,以及 item 数据的键值对。
import QtQuick
import QtQuick.Controls
import Qt.labs.qmlmodels
ApplicationWindow {
visible: true
width: 500
height: 500
TreeView {
id: treeView
anchors.fill: parent
selectionModel: ItemSelectionModel {}
model: TreeModel {
id: treeModel
TableModelColumn {
display: "checked"
}
TableModelColumn {
display: "size"
}
TableModelColumn {
display: "type"
}
TableModelColumn {
display: "name"
}
TableModelColumn {
display: "lastModified"
}
rows: [{
checked: false,
size: "—",
type: "folder",
name: "Documents",
lastModified: "2025-07-01",
rows: [{
checked: true,
size: "24 KB",
type: "file",
name: "Resume.pdf",
lastModified: "2025-06-20",
}, {
checked: false,
size: "2 MB",
type: "folder",
name: "Reports",
lastModified: "2025-06-10",
rows: [{
checked: true,
size: "850 KB",
type: "file",
name: "Q2_Report.docx",
lastModified: "2025-06-15",
}, {
checked: false,
size: "1.2 MB",
type: "file",
name: "Q3_Plan.xlsx",
lastModified: "2025-06-18",
}]
}]
},
{
checked: false,
size: "—",
type: "folder",
name: "Pictures",
lastModified: "2025-05-30",
rows: [{
checked: true,
size: "3.5 MB",
type: "file",
name: "Vacation.jpg",
lastModified: "2025-05-15",
}, {
checked: false,
size: "2.1 MB",
type: "file",
name: "Family.png",
lastModified: "2025-05-20",
}]
}
]
}
delegate: TreeViewDelegate {}
}
}
在 QML 和 Qt Quick UI 中获取和更新数据的方式众多,但一直缺少直接从 QML 内部对数据进行排序和过滤的功能。在 C++ 方面,QSortFilterProxyModel早在模型/视图框架的早期就已存在。在 Qt 6.10 中,我们将借助声明式且兼容绑定的 API,为 QML 带来大量排序和过滤功能的增强。
ListModel {
id: colorModel
ListElement { color: "blue" }
ListElement { color: "green" }
ListElement { color: "red" }
ListElement { color: "yellow" }
ListElement { color: "orange" }
ListElement { color: "purple" }
}
SortFilterProxyModel {
id: colorFilter
model: colorModel
sorters:[
RoleSorter {
roleName: "color"
}
]
filters:[
FunctionFilter {
component CustomData: QtObject { property string color }
property var regExp: new RegExp(colorSearch.text, "i")
onRegExpChanged: invalidate()
function filter(data: CustomData): bool {
return regExp.test(data.color);
}
}
]
}
有关 QMLSortFilterProxyModel 的更多信息,请参阅Santhosh的博客。
操作系统在不断发展,用户希望能在更新的设备和最新版本的系统软件上运行自己喜欢的软件。
Qt 6.10 包含多项增强功能,使面向 Android 平台的开发更加友好,新增了对最新 Android 版本的支持,并让您的应用更容易给用户留下良好的第一印象。
Qt 6.10 正式支持 Android 15 和 16。这包括对构建系统的更新和对 16K 页面的支持,让您能够面向最新的 Android 设备进行开发。这一支持确保了 Qt 应用程序在不断发展的 Android 生态系统中保持稳定和高性能运行。
Qt Jenny 1.0 是一款新工具,可简化 Android Java API 与 Qt 应用程序的集成流程。该工具作为 JNI 粘合代码生成器,允许开发者通过带注解的 Java 类自动生成 Qt C++ API。Qt Jenny 包含编译器和注解处理器,可从 Qt 代码访问 BatteryManager、PowerManager 和 AudioManager 等 Android 原生服务。生成的代码使用 QJniObject,同时支持通知功能(通过 JNI 实现较为复杂)。现在可通过 Maven Central 获取 Qt Jenny,相关示例已集成至 Qt Creator 和在线文档,助力开发者快速上手。
自 Android 12 引入默认启动画面 API 后,Qt 应用需要避免出现双重启动画面——先是 Android 的,然后是 Qt 的。在 Qt 6.10 中,我们提供了示例和指导,帮助实现从 Android 启动画面到 Qt 启动画面的平滑过渡。这包括使用专用的 SplashActivity 、自定义半透明主题,以及仅在 Android 准备就绪后才启动 Qt 活动。这将带来更完美、更一致的启动体验,特别是对于跨平台应用程序。
Qt 6.10 是 MacOS 26 "Tahoe "几个星期前推出测试版后的第一个 Qt 小版本。自 6 月份发布以来的几个月中,我们一直在努力确保 Qt 应用程序在最新版本的 macOS 和 iOS 上运行良好。
新的 Liquid Glass 设计系统和 macOS 底层渲染架构的变化给我们带来了一些挑战,我们很高兴将macOS 26 列为 Qt 完全支持的平台。在即将发布的 LTS 分支补丁中,我们还将提供许多改进,Qt 6.8和Qt 6.5版本也将支持macOS 26。
Qt 6.10 为 Windows 平台的 Qt WebView 模块新增了基于 WebView2 的实现方案。该模块无需依赖 Chromium 内核的 Qt WebEngine,而是通过原生浏览器引擎,便捷地将基于网页技术构建的 UI 元素嵌入原生 Qt 应用。借助 WebView2 插件,Qt WebView 现可采用 Microsoft Edge 作为渲染引擎,使得开发者无需部署 Qt WebEngine 即可在 Windows 平台发布此类应用。
在 Linux 系统中,PipeWire 是一个现代多媒体框架,它提供了更好的性能和延迟,更好的内容处理和硬件控制与处理,以及对容器化应用程序的支持。Qt Multimedia 现在为该系统提供了一个后台。此外,我们还实现了音频音高补偿,让最终用户在播放加速或减速音轨时获得更好的音频效果。
设备制造商会发现 Boot to Qt 现已支持 Yocto 5.2 "Walnascar"版本,同时我们新增了对多款 Ezurio Nitrogen 开发板的硬件适配支持。
借助 Qt Quick 3D,您现在可以轻松烘焙光照贴图,在高性能下实现更高质量的渲染效果,还能让粒子特效反向运行,创造出雨雪碰撞模型的逼真效果。Qt Graphs 新增了填充表面类型,更好地支持多轴系统和 2D 场景中的自定义 Z 轴排序,并能将 3D 图形的切片渲染为可打印图像。Qt Widgets 简化了自定义委托的实现过程,增强了对项目视图中拖放功能的控制能力,布局的大小限制现在可以单独配置。Qt 6.10 的虚拟键盘新增了拉脱维亚语布局,Qt Core 在处理本地化、XML 文档和延续链方面也有许多改进。
您可以在我们的文档中找到新 API 和功能的完整列表。
感谢所有为 Qt 6.10 实现做出贡献的开发者们。您可以在发布说明的末尾找到为 Qt 源代码提供补丁的所有社区成员的完整列表。
特别感谢所有通过报告错误、发送反馈或分享使用案例来帮助改进 Qt 的各位。最后最重要的是,感谢所有参与版本发布的人员!