Qt Quick 控件变更

Qt 6 致力于使框架更加高效和易于使用。

我们试图在每个版本中保持所有公共 API 的兼容性。为了使 Qt 成为更好的框架,一些变更在所难免。

在本主题中,我们总结了 Qt Quick 控件中的这些变更,并提供了解决这些变更的指南。

从 Qt Quick Controls 1 迁移

Qt Quick Controls 1 在 Qt 5.11 中已被弃用,并在 Qt 6.0 中被移除。请使用 Qt Quick Controls(以前称为 Qt Quick Controls 2)。有关更多信息,请参阅 Qt 5 文档中的Qt 5.15: Qt Quick Controls 与 Qt Quick Controls 1 的比较 部分。

类型注册变更

Qt Quick Controls 在 Qt 6 中经历了一些重大更改,大部分是内部更改。通过利用 Qt 5.15 中引入的类型注册改进,我们为编译该模块的 QML 文件铺平道路,并使工具更加有效。特别是,Qt Creator 的 QML 代码模型应该对类型有一个更全面的了解,使其对 Qt Quick Controls 代码的补全和错误检查更加可靠。像 qmllint 和 qmlformat 这样的静态分析工具也从现在可以在编译时声明类型意识中受益。

因此,一些事情的处理方式略有不同。

自定义样式现在是正确的 QML 模块

为了启用编译时类型注册,每个 Qt Quick Controls 风格现在是一个正确的 QML 模块。以前,一个单独的 Button.qml 就足够创建您自己的样式。虽然方便,但这需要一些非标准 API,进而需要像 Qt Designer 这样的工具进行适应性修改。

现在,所有实现于样式中的 QML 类型都必须在其 qmldir 文件中声明

module MyStyle
Button 1.0 Button.qml

通过与 QML 世界的其余部分统一,样式对开发者来说更为熟悉,也许对于初学者来说更容易理解。因此,以下 API 必须删除:

  • QQuickStyle::addStylePath()
  • QQuickStyle::availableStyles()
  • QQuickStyle::path()
  • QQuickStyle::stylePathList()
  • QT_QUICK_CONTROLS_STYLE_PATH

由于风格现在必须像任何其他 QML 模块一样出现在 QML 引擎的导入路径中,因此不再需要或可能支持此 API。

样式名称

此外,现在只有一个有效、区分大小写的样式名称形式:“Material”、“MyStyle”等。也就是说,样式名称必须与 QML 模块名称完全匹配。这也适用于文件选择器,以前,所有样式名称都是小写。例如,以下结构对于 Qt 5 项目是有效的:

MyProject
├── main.qml
├── HomePage.qml
└── +material
    └───HomePage.qml

在 Qt 6 中,+material 变为 +Material

MyProject
├── main.qml
├── HomePage.qml
└── +Material
    └───HomePage.qml

现有的所有运行具有特定样式的应用程序的方式仍然受支持。

运行时和编译时样式选择

由于导入方式的内部原因,现在导入样式有额外含义。之前,导入 QtQuick.Controls 将注册当前样式的控件类型到 QML 引擎

import QtQuick.Controls

我们称之为运行时样式选择,因为样式是在运行时选择的。

显式导入 QtQuick.Controls.Material 将简单地公开该样式提供的任何额外 API(例如,附加的 Material 类型)

import QtQuick.Controls.Material

现在,显式导入样式会做两件事情。

这意味着将从最后导入的样式使用的控件类型(如按钮)。我们称之为编译时样式选择。

这将影响现有代码。具体来说,如果您的应用程序支持多个样式,请将此类导入移动到自己的 QML 文件中,并选择文件。

例如,如果您有以下 main.qml

import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Controls.Universal

ApplicationWindow {
    width: 600
    height: 400
    visible: true

    Material.theme: darkMode ? Material.Dark : Material.Light
    Universal.theme: darkMode ? Universal.Dark : Universal.Light

    // Child items, etc.
}

您可以将常用代码移动到“基础”组件中

// MainWindow.qml

import QtQuick.Controls

ApplicationWindow {}

然后,添加一个 +Material 子目录,并在其中添加特定的 Material 代码到 MainWindow.qml

// +Material/MainWindow.qml

import QtQuick.Controls.Material

ApplicationWindow {
    Material.theme: darkMode ? Material.Dark : Material.Light
}

对通用型号做同样的事情

// +Universal/MainWindow.qml

import QtQuick.Controls.Universal

ApplicationWindow {
    Universal.theme: darkMode ? Universal.Dark : Universal.Light
}

然后,在 main.qml

import QtQuick.Controls

MainWindow {
    width: 600
    height: 400
    visible: true

    // Child items, etc.
}

另请参阅:与 Qt Quick Controls 一起使用文件选择器

默认样式

默认样式已被重命名为“基本”,因为它不再是默认样式。相反,现在根据 Qt 构建的平台选择默认样式

因此,未在 Qt 5 中指定样式且已自定义控件的应用程序应在 Qt 6 中显式指定基本样式,以确保这些控件的外观和行为与 Qt 5 时相同。

调色板

调色板 API 已移动到 QQuickItem。Qt Quick Controls 中使用调色板的各个 API 未经更改。

控件

ApplicationWindow 的更改

已删除过时的覆盖属性和附加 API。请使用 Overlay 附加类型。

ComboBox 的更改

pressed 属性现在是只读的。要修改 ComboBox 的视觉按下状态,请使用 down 属性。

Container 的更改

已删除过时的 removeItem(var) 函数。removeItem(Item) 或 takeItem(int) 可以用。

Dialog 的更改

Dialogaccepted() 和 rejected() 信号现在在调用 done()、accept() 和 reject() 之前发出,当调用 closed() 时也是如此。

菜单变动

已弃用的removeItem(var)函数已被删除。可以使用removeItem(Item)或takeItem(int)代替。

工具提示变动

ToolTip的计时器现在仅在opened()被触发后开始。这导致带有进入转换的提示框在整个计时器属性持续时间内可见。这意味着它们的可见时间比之前稍长,因此在必要时可能需要检查应用中的提示框并调整计时器。

StackView变动

StackView的 Transition 枚举值已被弃用。可以省略操作参数,以便在给定操作中使用默认转换。

Tumbler变动

implicitWidthimplicitHeight现在必须为TumblercontentItem提供,使其与其他所有控件保持一致。

©2024 The Qt Company Ltd. 此处包含的文档贡献属于其各自的版权所有者。此处提供的文档根据自由软件基金会有关的协议(GNU自由文档许可版本1.3)进行许可。Qt和相应的标志是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均归各自所有者所有。