自定义 Qt Quick Controls

2023-05-16

自定义 Qt Quick Controls

使用 Qt Quick 编写界面时,使用 Qt Quick Controls(指Qt Quick Controls 2)模块中提供的大量控件,可以快速开发出可用、风格统一的应用界面。

Qt Quick Controls 提供了选择不同控件样式以及自定义控件样式的能力。

选择不同的控件样式

Qt Quick Controls 中已经实现了几种不同的控件样式,如 Material Style, Fusion Style, Imagine Style, Universal Style 以及 Default Style。

软件默认情况下使用 Default Style。

设置软件控件样式的方式包括:

  • 调用 QQuickStyle 方法
QQuickStyle::addStylePath(":/styles");
QQuickStyle::setStyle("MyStyle");
QQuickStyle::setFallbackStyle("Material");

以上通过代码 QQuickStyle 设置控件样式的方式,需要在加载 QML 文档之前设置,否则无法生效。

  • 向软件传入命令行参数 -style
./myapp -style MyStyle
  • 设置环境变量 QT_QUICK_CONTROLS_STYLE=

创建 qtquickcontrols2.conf,并放在 qrc 根目录中。Qt能够识别该文件并读取其中的配置。

以上几种设置方式的优先级由高到低。其中最为推荐的方式是使用 qtquickcontrols2.conf 配置文件来配置控件样式。

需要注意一点,由于软件在查找设置样式的控件源码时,会在资源(qrc)中寻找,所以不是存放定义控件样式的代码文件的目录不要和该样式重名。如设置样式为 Material,在 qrc 中又有一个 :/Material 目录,用来存放一些图片等资源文件,将无法正确加载和设置 Material 样式。

创建自定义控件样式

Qt Quick Controls 的控件由元素以属性结构组成,其中每个元素都可以自定义外观,默认的 QML 元素实现,可以使用自定义元素来替换。

自定义控件

自定义一个控件的方式有多种:

  • 直接在使用的地方定义这个控件。

如:需要一个不同于指定样式的 Button。可以在使用 Button 的地方直接重写其 background 属性。

// ...

ApplicationWindow {
  Button {
    id: control
    anchors.centerIn: parent
    text: "click"
    background: Rectangle { // 在 Button 使用的地方,重写了其 background 属性。
      implicitWidth: 80
      implicitHeight: 30
      color: control.down ? "grey" : "white"
    }
  }
}

// ...
  • 将自定义控件放到独立的QML文档中,然后引入使用。

例如创建一个 MyButton.qml 文件,其放在资源系统中 :/MyButton.qml,则可以直接使用它。

// ...
ApplicationWindow {
  MyButton {
    anchors.centerIn: parent
  }
}
// ...

或者创建一个 Button.qml,然后放入资源系统中的独立目录,如: :/controls 中。则可通过 import 的方式使用。

import "./controls" as MyControls

ApplicationWindow {
  MyControls.Button {
    anchors.centerIn: parent
  }
}

自定义样式

在 Qt Quick Controls 中,样式是一组存在于同一个目录下的QML文件。可用的样式满足以下三个条件:

  • 目录中至少存在一个和 Qt Quick Controls 中控件同名的QML文件。

如在Qt资源系统中,自定义样式存放于 :/styles/MyStyle 中,自定义了 Button.qml,其路径为::/styles/MyStyle/Button.qml。

  • 各个QML文件中必须使用与其文件名对应的 QtQuick.Templates 中的模板控件元素作为QML文档的根元素。

如 Button.qml 的内容如下:

import QtQuick.Templates 2.15 as T

T.Button {
  // ...
}
  • 这些文件必须能存在于应用的导入路径中。

这些合法路径包括:

  • <样式所在文件系统目录中的绝对路径>
  • 资源系统中的路径,如::/styles/MyStyle
  • 相对路径,如:./qml/styles/MyStyle
  • QQmlEngine::importPathList()中的路径
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Qt Quick Controls 的相关文章

  • win32 c++ 在没有子类化的情况下检测编辑控件中的“输入”?

    基本上 我想要一个 Enter 来触发一条消息 当编辑控件获得焦点并且用户按下 Enter 时 我可以捕获该消息 网上所有的解决方案似乎都是关于子类化的 但我想知道是否还有其他方法可以解决这个问题 例如 我的按钮有一个标识符 ID BUTT
  • TFS 无法识别添加的项目 VS2013 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 VS2013 和 TFS Online 当我添加一个新项目时 源代码管理不会将其识别为添加的项目 但 csproj 会使用新文件
  • 从子表单更改父表单属性的正确方法是什么?

    我只是想知道我是否以正确的方式这样做 我有两个表单 一个父表单和一个子表单 选项对话框 要从子表单更改父表单中的属性 我使用如下代码 Create an array of all rich textboxes on the parent f
  • 通过 jQuery 禁用所有页面控件

    我正在研究 asp net 和 c 我在页面上使用大量 ASP 和 HTML 控件 在某些情况下 所有控件都会被禁用 一些使用的控件是 RadioButton RadioButtonList CheckBox CheckBoxList Te
  • 替换delphi中的组件类

    我知道我在某个地方看到过一个 hack 的例子 用于定义现有 VCL 组件的自定义版本 例如TButton or TEdit 具有相同的类名 并执行一些操作 以便 DFM Streamer 实例化您的版本而不是原始版本 不幸的是 我所处的情
  • ZedGraph (.NET) - 仅具有实际值的轴标签

    使用ZedGraph http zedgraph org控制 假设我正在绘制 Y 值为 13 34 和 55 的数据 如何设置 Y 轴 以便仅显示 13 34 和 55 的文本标签 我猜网格线将同步 我不希望在数据范围内有规则间隔的标签 例
  • ASP.NET 的密码强度控制

    我需要 ASP NET 的密码强度控制 我查看了ajax控制工具包中的控制 但它不是完全可配置的 我需要将它静态地放置在布局上 尝试使用谷歌 Google 密码强度 APIhttp www codeproject com KB ajax G
  • 如何在不阻塞的情况下向listview填充大量信息?

    我在后台线程上创建一个 ListViewItems 数组 然后在 ui 线程上用它填充我的列表视图 问题是 如果数组太大 则更新列表视图时 ui 会阻塞 有没有一种方法可以填充列表视图 同时对用户界面影响很小 如果您有大量数据进入其中 您可
  • 帕累托最优前沿

    我试图获得两个适应度函数的帕累托最优前沿 我通过使用虚拟矩阵对非支配解进行排序 该虚拟矩阵在矩阵中为任何非支配解分配 1 当我绘制帕累托前沿时 它不断包含我知道不属于帕累托最优的点 但是 我似乎找不到这个问题的原因 任何帮助将非常感激 fo
  • DropBox 作为版本控制和异地备份

    在读完 Michael Lopp 的书 Being Geek 后 我开始使用 Dropbox 作为在家庭计算机和工作计算机之间同步文件的一种方式 这太棒了 它确实让您可以轻松地跟踪您正在处理的文件的最新版本 我的问题与人们使用此工具的经验有
  • Windows 窗体中的十进制文本框

    我正在做一个 Financial Winforms 应用程序 但在控件方面遇到了一些问题 我的客户需要在各处插入小数值 价格 折扣等 我想避免一些重复验证 因此 如果不是因为焦点和蒙版的长度 我立即尝试了能够满足我的需求的 MaskedTe
  • 如何在两个不同的选项卡上显示相同的控件?

    我正在使用VB NET 我需要在两个不同的选项卡上显示相同的控件 ListBox 是否必须创建 2 个不同的 ListBox 实例 如果您不需要设计时支持 您可以简单地在运行时将 ListBox 实例的父级从一个选项卡更改为另一个选项卡 当
  • 当我移动轨迹栏时,如何防止 Windows 通用控件 6.0 中的控件(选项卡)闪烁和消失?

    滑动滑动条并释放鼠标按钮时 整个窗口都会闪烁 并且选项卡会消失 当我使用旧版本时 一切正常 当我使用新的 Microsoft Windows Common Controls ver 6 0 时 出现此问题 include
  • 即使设置了 Dock 属性,也可以强制执行 Margin 吗?

    我有一个WinFormsForm上面有一些控件 他们都是GroupBox控件 我希望它们堆叠在一起 并在它们之间设置垂直边距 我已经设置了Dock属性设置为 Top 并且可以正常堆叠它们 但忽略边距 控件彼此尽可能靠近 这些利润仍然可以以某
  • 在ASP.NET中的子控件中创建ASP.NET ReportViewer;文档结构图按钮中断

    我们在使用 Visual Studio 2008 ReportViewer 控件时遇到了一个奇怪的问题 具体来说 当我们在页面上有一个子控件 并且子控件本身承载一个报表查看器 并且该报表具有文档结构图时 显示 隐藏文档结构图按钮上的回发似乎
  • JTextArea 中控制字符的 Java 图像

    我正在编写一个由 2 个面板组成的应用程序 一个 JTextArea 用于输入文本 另一个用于显示文本 In these texts I have two special characters namely STX ETX 0x02 0x0
  • 为什么 ASP.NET Dynamic 控件即使添加到 Page_Load 中也能保留 ViewState?

    我做了一些与动态控件和 ViewState 相关的研究 我读到 为了保留动态控件的 ViewState 您必须将其添加到 Page Init 事件中 这是有道理的 因为 PageLifeCycle 是 初始化 加载视图状态 加载回发数据 L
  • GetWindowTextA、GetWindowText 在编辑控件上返回空值

    我正在尝试从 C Java 的外部窗口列出并获取编辑控件的内容 不幸的是没有成功 当我调用 GetWindowText 或 GetWindowTextA 时 它在编辑控件上返回空值 我知道 GetWindowText GetWindowTe
  • 在 MS-Access 中以编程方式隐藏列

    我想根据用户选择的变量数据隐藏或显示列 如何在 MS Access 2003 中将列设置为隐藏 例如 用户更改事件后 For Each ctl In Me FormNameHere Form Controls If TypeName ctl
  • 为什么有些控件同时具有BackgroundImage和Image属性?

    为什么有些控件喜欢Button or PictureBox两者都有BackgroundImage and Image财产 为什么在按钮的情况下需要它们两个 或者为什么在图片框中背景图像应该可用 BackgroundImage继承自Contr

随机推荐