自定义 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 的相关文章

  • 无法从内容页面访问内容控件?

    我的内容页面如下所示
  • ListView 中的自动宽度[重复]

    这个问题在这里已经有答案了 ListView中如何根据内容的长度设置每列的宽度 我讨厌必须在运行时不断更改每列的大小 是否有包含此信息的 MSDN 文档 我找不到我应该寻找的地方 谢谢 填充列表后使用两个调整大小选项 myListView
  • 通过 jQuery 禁用所有页面控件

    我正在研究 asp net 和 c 我在页面上使用大量 ASP 和 HTML 控件 在某些情况下 所有控件都会被禁用 一些使用的控件是 RadioButton RadioButtonList CheckBox CheckBoxList Te
  • c# readonly DataGridView 与一个启用的单元格

    我有只读 datagridview 在某些特定情况下 我需要在双击行后启用一个单元格 使 readonly false 并将焦点放在当前行中的该特定单元格上 例如输入它 光标应该开始闪烁 I have private void dataGr
  • 什么时候应该使用 Localize 控件而不是 Literal?

    我最近意识到System Web UI WebControls Localize http msdn microsoft com en us library system web ui webcontrols localize aspxAS
  • 如何在Control上绘图以使绘图不消失?

    我想在 PictureBox 中显示图形文件 private void btnLoad Click object sender EventArgs e if dgOpenFile ShowDialog DialogResult OK Bit
  • 如何在不阻塞的情况下向listview填充大量信息?

    我在后台线程上创建一个 ListViewItems 数组 然后在 ui 线程上用它填充我的列表视图 问题是 如果数组太大 则更新列表视图时 ui 会阻塞 有没有一种方法可以填充列表视图 同时对用户界面影响很小 如果您有大量数据进入其中 您可
  • 如何在 ASP.Net 中创建带有子控件集合的控件

    我正在尝试为 ASP NET 开发一个自定义控件 该控件将具有以下标记
  • WPF 将控件可见性绑定到另一个控件的聚焦属性

    我有一个显示项目列表的组合框 我想在它旁边放置一个按钮来触发命令以查看所选项目的详细信息 到目前为止 一切都很好 现在我希望该按钮仅在组合框具有焦点时才可见 或处于 编辑 模式 但不仅在弹出窗口打开时 我想我可以将按钮的可见性绑定到组合框的
  • 自定义按钮的前景色(ControlPresenter)

    我正在尝试在 App xaml 中定义全局按钮样式 它基本上按我的预期工作 但是 我只是不知道如何让前台正常工作 无论我做什么 我都会获得默认 TextBlock 的样式 它将颜色设置为白色
  • 当我移动轨迹栏时,如何防止 Windows 通用控件 6.0 中的控件(选项卡)闪烁和消失?

    滑动滑动条并释放鼠标按钮时 整个窗口都会闪烁 并且选项卡会消失 当我使用旧版本时 一切正常 当我使用新的 Microsoft Windows Common Controls ver 6 0 时 出现此问题 include
  • 使用 XML 差异和合并进行版本控制

    我正在寻找一个开源版本控制工具 可以比较和合并 XML 文件 我必须找到这样一个工具的困难在于 我需要正确合并比较节点而不是行的 XML 文件 任何想法 谢谢 不幸的是 对于这个问题没有一刀切的解决方案 XML 比较对于您认为不同的内容非常
  • 即使设置了 Dock 属性,也可以强制执行 Margin 吗?

    我有一个WinFormsForm上面有一些控件 他们都是GroupBox控件 我希望它们堆叠在一起 并在它们之间设置垂直边距 我已经设置了Dock属性设置为 Top 并且可以正常堆叠它们 但忽略边距 控件彼此尽可能靠近 这些利润仍然可以以某
  • 具有多个控件和 generic.xaml 的自定义控件库

    如果我在一个自定义控件库中为两个不同的控件定义两种默认样式 我会收到错误 一个库中是否可以有两个或多个具有默认 generic xaml 的控件 Thanks 对的 这是可能的 推荐的方法是将每个控件的样式放置在其自己的资源字典中 并拥有一
  • 使用项目资源(WPF)的图像源

    我添加了一堆图像作为项目资源 现在我想在我的 WPF 应用程序中使用图像控件来使用它们 如何将资源分配给图像控件的源 首先 在 Visual Studio 的属性窗口中将图像文件标记为 资源 然后您可以很容易地使用文件名引用资源
  • 在运行时拖动窗体上的控件

    我刚刚开始使用 WPF 但我正在尝试添加我的代码 来自 Winforms 使用户能够在运行时将任何控件拖动到他们想要的任何位置 但我似乎无法获取鼠标当前的位置 呃 没有鼠标位置 在 Mouse 事件中 您可以使用 e GetPosition
  • iOS 11.x 系统颜色

    我读过很多关于如何自定义视图颜色的文章 但没有任何关于检索标准控件 如 iOS 11 x 或以前版本中的导航栏 状态栏和选项卡栏 的系统颜色的文章 UIColor 类有 3 种系统颜色 但它们几乎没有用 例如 调用 UINavigation
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • WPF 按钮需要单击两次才能触发 Click 事件

    我有一个 TabItem 其中包含一个日历控件和一个按钮 问题是 当日历的选择日期与先前选择的日期相同时 该按钮需要单击两次才能触发其 Click 事件 我实现了日历的 selectedDatesChanged 事件来解决当当前选择的日期与
  • Windows GUI 控件 ID 是如何创建的?

    在 Windows 中 对于每个控件 例如每个对话框 窗口 文本框和复选框等 都会给出一个控件 ID 这个控件id是如何创建的 Windows 中的两个应用程序可以具有相同的控件 ID 吗 有没有办法手动设置 Windows 控件 ID 控

随机推荐