Qt Quick Controls

Qt 6 的改动是有意识地使框架更高效、更易用的结果。

我们尝试在每个版本中保持所有公共 API 的兼容性。为了使 Qt 成为更好的框架,有些改动是不可避免的。

在本主题中,我们总结了Qt Quick Controls 中的这些变化,并提供了处理这些变化的指导。

Qt Quick Controls 1 迁移

Qt Quick Controls 1 在 Qt 5.11 中被弃用,并从 Qt 6.0 中移除。请使用 (以前称为 2)。有关详细信息,请参阅 Qt 5 文档中的Qt Quick Controls Qt Quick Controls Qt 5.15: vs 1Qt Quick Controls Qt Quick Controls 主题。

类型注册更改

Qt Quick Controls 在 Qt 6 中,"类型注册 "经历了一些大的变化,主要是内部变化。通过利用 Qt 5.15 中引入的改进的类型注册,我们为将模块的 QML 文件编译为 C++ 铺平了道路,并使工具变得更加有效。尤其是, 的 QML 代码模型应该对类型有更全面的了解,从而使 代码的完成和错误检查更加可靠。像 qmllint 和 qmlformat 这样的静态分析工具,也能通过了解 C++ 编译时声明的类型而受益。Qt Creator Qt Quick Controls

由于这些变化,有些事情的处理方式有些不同。

自定义样式现在是适当的 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

而现在,显式导入样式可以同时做到这两点。

这实际上意味着将使用上次导入样式中的控件类型(如 Button)。我们将此称为编译时样式选择。

这对现有代码有影响。也就是说,如果您的应用程序支持一种以上的样式,请将这些导入移到它们自己的 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 子目录,并在其中将特定于材料的代码添加到MainWindow.qml 中:

// +Material/MainWindow.qml

import QtQuick.Controls.Material

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

同样的方法也适用于 Universal:

// +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 中使用文件选择器

默认样式

默认样式已更名为 "Basic",因为它不再是默认样式。取而代之的是,默认样式现在是根据 Qt 所构建的平台来选择的:

因此,在 Qt 5 中没有指定样式但拥有自定义控件的应用程序,应在 Qt 6 中明确指定Basic 样式,以确保这些控件的外观和行为与 Qt 5 中的相同。

调色板

调色板 API 已移至QQuickItem 。在Qt Quick Controls 中使用调色板的各种 API 保持不变。

控件

对 ApplicationWindow 的修改

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

对 ComboBox 的更改

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

对容器的更改

删除了已废弃的removeItem(var) 函数。removeItem(Item) 或takeItem(int) 代替。

对对话框的更改

Dialog调用done(),accept() 和reject() 时,accepted() 和rejected() 信号现在在closed() 之前发出。

对菜单的更改

删除了已废弃的removeItem(var) 函数。removeItem(Item) 或takeItem(int) 函数。

对工具提示的更改

ToolTip现在,只有在opened() 发出后,超时才会开始。这使得带有回车过渡的工具提示在超时属性的整个持续时间内都是可见的。这意味着工具提示的可见时间比以前稍长,因此值得在应用程序中目视检查工具提示,并在必要时调整超时时间。

对 StackView 的更改

StackView.Transition 枚举值已被弃用。可以省略操作参数,以便为任何给定操作使用默认转换。

对 Tumbler 的更改

implicitWidth 和 现在必须提供 的 ,使其与所有其他控件保持一致。implicitHeight Tumbler contentItem

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.