Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面

2023-11-13


Qt6 焦点

Qt 5在很多年前发布,引入了一种新的声明方式来编写令人惊叹的用户界面。从那时起,我们周围的世界发生了很大的变化。

Qt 6将是Qt 5的延续,不会对大多数用户造成干扰。是什么让Qt对用户有价值?

  1. 它的跨平台特性
  2. 它的可扩展性
  3. 世界一流的API和文档
  4. 可维护性、稳定性和兼容性
  5. 一个庞大的开发者生态系统

桌面市场是Qt产品的基础。这是大多数用户第一次接触Qt的地方,也是Qt工具及其成功的基础。
预计Qt 6将在嵌入式和互联设备市场增长最多,从高端近桌面执行设备到微控制器等低端设备。对于这些设备来说,触摸屏的数量将呈指数增长。这些设备中的许多将具有相对简单的功能,但是需要完美和平滑的用户界面。

另一方面,需要更复杂的2D/3D集成用户界面。具有基于2D元素的界面的3D内容将很常见,增强和虚拟现实的使用也将如此。
互联设备的增长和对流畅用户界面的更高需求要求更简单的工作流程来创建应用和设备。将UX设计师整合到开发工作流程中是Qt 6系列的目标之一。


Qt6 核心-基本模块

开始QML编程的Qt 6模块的最小集合。

  1. Qt内核-其他模块使用的核心非图形类。
  2. Qt D总线linux上通过D-Bus协议进行进程间通信的类。
  3. Qt GUI-图形用户界面(GUI)组件的基类。包括OpenGL。
  4. Qt网络-类,使网络编程更容易和更可移植。
  5. Qt QML-QML和JavaScript语言的类。
  6. Qt快速-用于构建具有自定义用户界面的高度动态应用程序的声明性框架。
  7. Qt快速控制-提供轻量级QML类型,用于为桌面、嵌入式和移动设备创建高性能用户界面。这些类型采用简单的样式架构,非常高效。
  8. Qt快速布局-布局是用于在用户界面中排列基于Qt Quick 2的项目的项目。
  9. Qt快速测试-QML应用程序的单元测试框架,其中的测试用例是作为JavaScript函数编写的。
  10. Qt试验-单元测试Qt应用程序和库的类。
  11. Qt部件-用C++小部件扩展Qt GUI的类。

Qt6 附加模块

除了基本模块之外,Qt还提供了针对特定目的的附加模块。许多附加模块要么功能完整,向后兼容,要么只适用于某些平台。这里列出了一些可用的附加模块,但是请务必在Qt文档附件列表 (打开新窗口)在下面的列表中。

  • 网络:Qt蓝牙/ Qt网络授权
  • UI组件:Qt快速3D / Qt快速时间线/ Qt图表/ Qt数据可视化/ Qt Lottie动画/ Qt虚拟键盘
  • 制图法:Qt 3D / Qt图像格式/ Qt OpenGL / Qt着色器工具/ Qt SVG / Qt道路合成器
  • 助手:Qt 5核心兼容性API/ Qt并发/ Qt帮助/ Qt打印支持/Qt快速小部件/ Qt SCXML / Qt SQL /
    Qt状态机/ Qt UI工具/ Qt XML

Qt6 支持的平台

Qt支持各种平台,包括所有主要的桌面和嵌入式平台。通过Qt平台抽象,现在如果需要的话,将Qt移植到您自己的平台上比以往任何时候都容易。

在一个平台上测试Qt6非常耗时。Qt项目选择了一个平台子集来构建参考平台集。这些平台通过系统测试进行彻底测试,以确保最佳质量。但是,请记住,没有代码是没有错误的。


Qt6 简介

Qt Quick是Qt 6中使用的用户界面技术的总称。它是在Qt 4中引入的,现在扩展到了Qt 6。Qt Quick本身是几种技术的集合:

  • QML -用户界面标记语言
  • JavaScript——动态脚本语言
  • Qt C++——高度可移植的增强型c++库

<类似于HTML,QML是一种标记语言。它由标记组成,这些标记在Qt Quick中称为类型,用花括号括起来:Item {}。
它完全是为了开发人员创建用户界面、速度和更容易阅读而设计的。使用JavaScript代码可以进一步增强用户界面。使用Qt C++,Qt Quick可以很容易地扩展您自己的原生功能。简而言之,声明式UI称为前端,本机部分称为后端。这允许您将应用程序的计算密集型和本机操作与用户界面部分分开。

在典型的项目中,前端是用QML/JavaScript开发的。后端代码是使用Qt C++开发的,它与系统进行交互,并完成繁重的工作。这允许更面向设计的开发人员和功能性开发人员之间的自然分离。通常,后端使用Qt Test(Qt单元测试框架)进行测试,并导出供前端开发人员使用。

Qt6 消化用户界面

让我们使用Qt Quick创建一个简单的用户界面,它展示了QML语言的一些方面。最终,我们将拥有一个带旋转叶片的纸风车。
在这里插入图片描述
我们从一个名为main.qml。我们所有的QML文件都会有这个后缀.qml。作为一种标记语言(像HTML),QML文档需要有且只有一个根类型。在我们的例子中,这是Image键入基于背景图像几何图形的宽度和高度:

import QtQuick

Image {
    id: root
    source: "images/background.png"
}

因为QML没有限制根类型的类型选择,所以我们使用Image键入source属性设置为我们的背景图像作为根。
在这里插入图片描述

每种类型都有属性。例如,图像具有以下属性widthheight,每个保存一个像素计数。它还具有其他属性,例如source。因为图像类型的大小是从图像大小自动派生的,所以我们不需要设置width和height我们自己的财产。

最标准的类型位于QtQuick模块,该模块由.qml文件。

id是一个特殊的可选属性,它包含一个标识符,该标识符可用于引用文档中其他位置的关联类型。重要提示:安id属性在设置后不能更改,也不能在运行时设置。使用root因为根类型的id是本书中使用的一个约定,使得在较大的QML文档中引用最顶层的类型是可预测的。

前景元素表示用户界面中的杆和风车,作为单独的图像包含在内。
在这里插入图片描述
在这里插入图片描述
我们希望将杆子水平放置在背景的中心,但垂直向底部偏移。我们想把风车放在背景的中间。

虽然这个初学者的例子只使用了图像类型,但是随着我们的进步,你将会创建由许多不同类型组成的更复杂的用户界面。

Image {
    id: root
    ...
    Image {
        id: pole
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.bottom
        source: "images/pole.png"
    }

    Image {
        id: wheel
        anchors.centerIn: parent
        source: "images/pinwheel.png"
    }
    ...
}

为了将风车放在中间,我们使用了一个复杂的属性,称为anchor。锚定允许您指定父对象和同级对象之间的几何关系。例如,将我置于另一类型的中心(anchors.centerIn: parent).两端有左、右、上、下、居中、填充、垂直居中和水平居中关系。自然地,当两个或更多的锚点一起使用时,它们应该互补:例如,将一个类型的左侧锚定到另一个类型的顶部是没有意义的。

对于风车,锚定只需要一个简单的锚。

有时您会想要做一些小的调整,例如,将文字稍微移离中心。这可以通过anchors.horizontalCenterOffset或与anchors.verticalCenterOffset。类似的调整属性也可用于所有其他锚点。有关锚点属性的完整列表,请参考文档。

将图像作为我们的根类型的子类型(即Image)说明了声明性语言的一个重要概念。您按照层和分组的顺序描述用户界面的视觉外观,其中首先绘制最顶层(我们的背景图像),然后在包含类型的局部坐标系中,在它的顶部绘制子层。

为了让展示更加有趣,让我们让场景互动起来。这个想法是当用户在场景中的某个地方按下鼠标时旋转轮子。

我们使用MouseArea类型,并使其覆盖我们的根类型的整个区域。

Image {
    id: root
    ...
    MouseArea {
        anchors.fill: parent
        onClicked: wheel.rotation += 90
    }
    ...
}

当用户在其覆盖的区域内单击时,鼠标区域会发出信号。您可以通过重写onClicked功能。当一个信号被连接时,意味着每当信号被发出时,它所对应的函数(或多个函数)被调用。在这种情况下,我们说当在鼠标区域有鼠标点击时,类型的idwheel(即风车图像)应该旋转+90度。

这种技术适用于每一种信号,命名惯例是on + SignalName在标题情况下。此外,所有属性在其值更改时都会发出信号。对于这些信号,命名惯例是:

`on${property}Changed`

例如,如果一个width属性被更改,您可以用onWidthChanged: print(width).

现在,每当用户点击时,滚轮就会旋转,但旋转发生在一次跳跃中,而不是随着时间的推移而流动。我们可以使用动画来实现流畅的移动。动画定义了一段时间内属性如何发生变化。为了实现这一点,我们使用Animation调用了类型的属性Behavior。这Behavior为定义的属性指定动画,以显示应用于该属性的每个更改。换句话说,每当属性改变时,动画就会运行。这只是QML制作动画的众多方式之一。

Image {
    id: root
    Image {
        id: wheel
        Behavior on rotation {
            NumberAnimation {
                duration: 250
            }
        }
    }
}

现在,每当轮子的旋转属性改变时,将使用NumberAnimation持续时间为250毫秒,所以每个90度的转弯需要250毫秒,产生一个漂亮平滑的转弯。
在这里插入图片描述

你实际上不会看到车轮模糊。这只是表示旋转。(一个模糊的轮子在“资源”文件夹中,如果你想尝试一下的话。)

现在,滚轮看起来更好了,表现也很好,并且提供了一个关于Qt快速编程如何工作的非常简单的见解。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面 的相关文章

  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • Flutter 获取验证码倒计时实现

    Timer countdownTimer String codeCountdownStr 获取验证码 int countdownNum 59 void reGetCountdown setState if countdownTimer nu
  • 机器学习随笔

    1 随机森林在大数据量和feature较多的时候效果比较好 反之的环境下还不如单独的决策树 森林中的每棵树都是独立的 99 9 不相关的树做出的预测结果涵盖所有的情况 这些预测结果将会彼此抵消 少数优秀的树的预测结果将会超脱于芸芸 噪音 做
  • 【Spring

    Resource Resource 接口 介绍 核心方法 常见接口 优缺点 内置 Resource 实现 UrlResource ClassPathResource FileSystemResource PathResource Servl
  • 多线程(C++)临界区Critical Sections问题

    多线程中用来确保同一时刻只有一个线程操作被保护的数据 InitializeCriticalSection cs 初始化临界区 EnterCriticalSection cs 进入临界区 操作数据 MyMoney 10 所有访问MyMoney
  • 重塑自监督学习: DINO 网络如何颠覆视觉特征表示的常规方法

    欢迎关注 CVHub 官方微信公众号 Title Emerging Properties in Self Supervised Vision Transformers Paper https openaccess thecvf com co
  • 解决idea中Cannot resolve method ‘setAttribute

    在学习jsp的时候 在idea上写代码遇上request setAttribute中setAttribute爆红错误 由于找到了解决方法 错误不想复现了 即下面的setAttribute爆红 但是可以正常运行 网上找了好多解决方法但是不适用
  • AD官方八月直播学习笔记-02

    文章目录 答疑 PCB导入logo 安装脚本 prjscr 在sripting syatem里的global projects里面点击安装 找到对应脚本文件 文件 运行脚本 弹出框里点load 位图文件 默认配置 界面里可以直接更改 框选
  • rpm包的rpmbuild spec文件详解

    http machael blog 51cto com 829462 213477 上一篇日志写到 为什么要制作rpm包 以及如何使用 src rpm文件生成rpm包 最后部分还看到 src rpm的内容 实际上 就是由 tar gz源码
  • JAVA单元测试框架-5-timeOut测试

    这篇先来介绍 Test注释下的一个属性 timeOut 主要用来超时判断 详细点说 如果哪个测试方法需要监听执行的时间 那么就可以考虑采用timeOut属性 例如 实际的接口测试中 加入登录接口时间不能超过3秒中 下面来看看如何监控这个方法
  • python为什么int()无法将float转化成int

    原因可能是你用了np zeros count 它的默认数据类型是float64类型的 而且不管你往这个np列表传入什么类型的值 或者后期怎么int 都没用 因为它会自动又改为float类型 并且这个float类型可不是原生的浮点类型 虽然
  • 【手势识别小车】---------(1)项目发起计划与准备

    嵌入式学习从大一到大二已经有两年了 学习了很多零零散散的东西 单片机 通信 视觉 ROS等等 但是没有进行系统的管子所以设计如下一个项目 作为自己阶段性的总结 功能设计 1 小车根据指令前进 后退 转向 停止 2 上位机摄像头进行人脸识别
  • GitHub 搜索技巧

    GitHub 作为目前广大程序猿最大的游乐场 在今年 6 月被 微软 以 75 亿美元价值的微软股票收购 GitHub 再次成为业界讨论的焦点 GitHub 以自由开放的定位吸引了相当多的个人开发者和企业 不断发布和更新相当好用的软件和工具
  • 毕业了

    自己的学生时代快告一段落 即将迎来的是工作时代 对未来充满了好奇 兴奋 希望我保有激情的去面对工作 在写论文的过程中 我也有对自己的论文感兴趣的 比如对Hadoop 但是对于另外一方面没了兴趣 也没有怎么深究 因此 这也是自己的论文的一个遗
  • Spock单元测试框架介绍及在美团优选的实践_第二章(static静态方法mock方式)

    Spock单元测试框架介绍 文章目录 Spock单元测试框架介绍 前言 一 什么是Spock单元测试框架 二 使用步骤 1 引入maven依赖 2 创建GoodsService订单业务类进行单测 3 创建Groovy class类 4 创建
  • pip安装yaml出错问题及解决方案

    pip安装yaml出错问题及解决方案 在使用Python开发过程中 可能会遇到需要安装第三方库的情况 而有时候我们在使用pip install安装某些库时 会遇到一些错误提示 其中就有可能会出现 ERROR Could not find a
  • python删除列数据,另存为xls格式带表头

    使用python删除列数据 import pandas as pd from pandas import DataFrame data pd read excel r 统计 xls sheet name Sheet1 del data 统计
  • LoadRunner 引入在eclipse中写的java项目,并介绍LR的使用(不是简单的打印语句项目)

    摸索了4天中终于在LoadRunner中把java脚本编译通过了 可以正常的运行Java脚本进行性能测试 一 介绍环境 eclipse JDK1 8 32位的 LR12 55 如果有需要LR12 55的小伙伴 在百度网盘直接下 链接 htt
  • 博客系统自动化测试项目实战(测试系列9)

    目录 前言 1 博客前端页面测试用例图 2 测试用例的代码实现 2 1登录页面的测试 2 2博客列表页面的测试 2 3写博客测试 2 4博客详情页面的测试 2 5已发布博客的标题和时间的测试 2 6注销用户的测试 结束语 前言 之前小编给大
  • Android Studio 插件开发8、替换文本

  • Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面

    文章目录 Qt6 焦点 Qt6 核心 基本模块 Qt6 附加模块 Qt6 支持的平台 Qt6 简介 Qt6 消化用户界面 Qt6 焦点 Qt 5在很多年前发布 引入了一种新的声明方式来编写令人惊叹的用户界面 从那时起 我们周围的世界发生了很