
Qt MOOC系列教程
amos.yang
十余年Qt实战经验,目前就职于Qt中国分公司。
展开
-
《Qt MOOC系列教程》第五章第六节:QML分析器
该教程已接近尾声,最后让我们再来讨论一下QML分析器。它是一种用于定位应用程序中性能问题的工具,如速度慢、不响应、界面不流畅等。典型的原因包括在较低的帧率中执行过多的JavaScript。在GUI线程继续之前,所有JavaScript必须返回,如果GUI线程没有准备好,则帧就会延迟或丢弃。导致类似性能问题的另一个典型原因是创建、绘制或更新不可见项,这在GUI线程中也需要花费时间。执行耗时的C++函数,如绘图方法和信号处理程序,在GUI线程中也会花费一些时间,但是QML 分析器很难捕获到它们,因为它不能解翻译 2020-12-20 16:08:48 · 591 阅读 · 0 评论 -
《Qt MOOC系列教程》第五章第五节:场景图项目
Qt Quick 2使用专用场景图进行渲染。使用场景图而不是传统的命令式绘图系统(QPainter或类似的系统)进行绘图,意味着要渲染的场景可以在帧之间进行保留,并且在开始渲染之前就已经了知道要渲染的完整原语集。也意味着开启了很多的优化空间,比如批量渲染以最小化状态更改和丢弃模糊的原语。假设一个用户界面是包含10个项目的列表,其中每个项目都有一个背景色、一个图标和一个文本。如果使用传统的绘图技术,就需要30次绘制调用和类似数量的状态更改。而如果使用场景图重新组织原语,可以在一次调用中绘制所有背景,然后是所翻译 2020-12-20 15:50:27 · 394 阅读 · 0 评论 -
《Qt MOOC系列教程》第五章第四节:QML中的C++模型
我们已经多次讨论过如何创建自己的模型来表示QML中的数据,并且在上一节中我们看到了QStandardItemModel的基本示例。通常,出于性能和功能方面的原因,需要从一开始就要实现自己的模型。QAbstactItemModel类为项目模型类提供了抽象接口,并且它可以被子类化以创建您自己的模型。QAbstractListModel和QAbstractTableModel继承了QAbstractItemModel,可以在创建列表或表格模型时将其子类化。在这一节中,我们将进一步介绍QAbstractTableM翻译 2020-12-20 15:48:01 · 611 阅读 · 0 评论 -
《Qt MOOC系列教程》第五章第三节:创建新的QML类型
到目前为止,我们已经讨论了如何将对象实例公开给QML上下文。有时我们还希望在QML中可以使用注册类本身。注册允许将类当作QML中的数据类型来使用。此外,注册还可以提供其他功能,比如允许在QML中将类用作可实例化的QML对象类型,或者允许在QML中导入和使用类的单例实例。通常我们使用Q_OBJECT宏注册从QObject派生的类,也可以用Q_GADGET宏声明一个比QObject“更轻”的版本。在这些更轻的类中,我们可以访问它们的属性、枚举和可调用的方法,但不能使用信号槽系统,我们稍后会进行介绍。1. 注翻译 2020-12-20 15:44:52 · 1017 阅读 · 0 评论 -
《Qt MOOC系列教程》第五章第二节:从QML访问C++
我们已经在上一节看到了使用上下文属性将C++对象暴露给QML的简单示例。在本节中,我们将通过在QML中使用C++对象的各种方式来讨论更多的细节,以及在C++端有哪些要求。当使用setContextProperty公开QObject实例时,可以从QML访问对象的属性、信号、槽、用Q_INVOKABLE标记的方法和用Q_ENUM注册的枚举。让我们看一个例子。// simpleclass.h#include <QObject>#include <QColor>class Sim翻译 2020-12-20 15:42:40 · 397 阅读 · 1 评论 -
《Qt MOOC系列教程》第五章第一节:QML上下文属性和对象
我们在第五章将学习如何集成C++和QML。大多数情况下,这意味着从QML访问C++,它是我们要介绍的重点。不过您也可以从C++访问QML对象,但通常这不是您想要做的,可能出于测试的目的除外,所以我们不在这里深入讨论。C++和QML之间的所有通信都是通过Qt元对象系统进行的。可以使用信号槽连接可以访问和修改属性QML可以调用C++中被Q_INVOKABLE标记的槽和方法QML可以访问被Q_ENUM注册的枚举1. QML上下文C++对象和值可以使用上下文属性和上下文对象直接嵌入到加载的QML对翻译 2020-12-20 15:40:21 · 957 阅读 · 2 评论 -
《Qt MOOC系列教程》第四章第四节:委托
委托用于充当实例化视图中的可视项模板。模型提供的数据角色绑定到可视项属性,例如Text.text或Image.source属性。只要为角色分配新值,委托就会更新绑定到角色的数据。模型则会通知所有视图数据值的更改。在下面的例子中,我们有一个TeamDelegate,它会在单击时更新绑定的数据:ListModel { id: teamModel ListElement { teamName: "Team C++" teamColor: "blue" }翻译 2020-12-17 20:09:32 · 1124 阅读 · 0 评论 -
《Qt MOOC系列教程》第四章第三节:视图
QML提供了四种常用的动态视图类型:ListView,GridView,TableView和PathView。前三个都继承于Flickable类型,这样用户就可以在水平或垂直方向滑动内容。注意,Qt Quick Controls 1中也有一个TableView类型,我们不推荐使用该类型,这里也不做介绍。使用PathView可以以任意路径形状组织数据项。每个视图都可以使用上一节中介绍的QML模型,然后在UI中设置委托项。QML中的所有模型都是列表。TableView是唯一可以直接显示C++表格模型中多个列的翻译 2020-12-17 20:07:56 · 379 阅读 · 0 评论 -
《Qt MOOC系列教程》第四章第二节:模型视图框架
除了ListModel之外,还有其他几种QML模型类型。如XmlistModel,使用它可以从XML数据源构造模型,它提供了一种非常方便的方法来解析XML数据。ObjectModel附带了要在视图中使用的可视项,它不需要委托,因为模型本身已经包含了可视项。DelegateModel在使用QAbstractItemModel索引访问数据项的情况下非常有用,典型的用例是层次树模型,用户可以在子树上下导航。您甚至可以把对象实例当作model。在这种情况下,对象属性就是角色名称,如以下示例所示。Text {翻译 2020-12-17 20:06:08 · 288 阅读 · 0 评论 -
《Qt MOOC系列教程》第四章第一节:模型视图框架
许多应用程序需要向用户显示数据,甚至允许用户操作和创建新数据。Qt模型视图框架可以使开发人员轻松地创建这样的应用程序。模型与视图的分离,可以使多个视图共享同一个模型,或者动态地更改一个视图模型。Model是数据及其结构的适配器。实际数据可能存储在任何地方,例如数据库或云上的数据中心。在一般情况下,模型本身也可以包含数据。QML有几种用于创建模型的类型,但如果想获得更高的效率请使用QAbstractItemModel的子类。View可以以任何可视结构显示数据,如列表、表格或路径。有用于堆栈项目的Sta翻译 2020-12-17 19:58:48 · 292 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第十一节:视觉效果
Qt Quick和QML为开发人员提供了多种方式来为用户界面添加视觉效果。Qt Quick Shapes允许您创建各种形状并填充图案。QML有大量的动画类型,这使得使用甚至非线性时间轴来设置任何对象的动画都很容易。OpenGL程序可以很容易地创建渐变或渐变阴影。让我们来看看如何在应用程序中添加视觉效果。1. 形状Shape类型,用于渲染任意形状(与我们已经看到的Rectangle类型相反)。Shape通过QPainterPath手动三角剖分生成几何形状然后使用GPU来进行渲染。这种方法不同于通过QQ翻译 2020-12-17 19:55:26 · 625 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第十节:自定义组件
1. 关于属性的更多信息在介绍本节的实际内容“自定义组件”之前,我们先对在第三章第二节中介绍的QML属性系统进行一些扩展。1.1 默认关键字在介绍属性时,您可能看到了这样的语法:[default] property <propertyType> <propertyName>它用于在QML中定义属性。然而在第三章第二节中,我们并没有解释过可选关键字default的用途。现在我们来讨论一下这个话题。声明对象时可以有一个唯一的default属性。如果一个对象是在另一个对象的定翻译 2020-12-17 19:53:19 · 227 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第九节:Qt Quick Controls
Qt Quick Controls提供了现成的UI控件,它使得您可以更快地进行工作,因为您不必从头开始实现所有的控件。例如ApplicationWindow提供了一个带有页眉、页脚、菜单栏和弹出窗口的QQuickWindow。其中的窗口可以包含视图、容器和控件的布局。请注意,当我们在本课程中谈到Qt Quick Controls时,指的是Qt Quick Controls 2。如果您查看Qt文档,您可能还会发现关于Qt Quick Controls 1的信息。它们在将来会被弃用,您应该避免使用它们。1翻译 2020-12-09 17:30:43 · 569 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第八节:锚定布局
1. 锚定除了传统的Grid,Row和Column布局,Qt Quick还提供了锚定布局。每个项目都有7条不可见的“锚线”:左,水平居中,右,顶部,垂直居中,基线和底部。基线(上图未显示)对应于文本所在的假想线。对于没有文本的项目,它与顶部相同。Qt Quick锚定系统允许您定义不同项目的锚定线之间的关系。例如,您可以编写:Rectangle { id: rect1; ... }Rectangle { id: rect2; anchors.left: rect1.right; ... }本例翻译 2020-12-07 19:55:41 · 607 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第七节:定位器
定位器项是在声明性用户界面中管理项位置的容器项。使用定位器可以轻松的实现在一个规则的布局中排版多个项目。Qt Quick Layouts也可以用于在用户界面中排列Qt Quick项。它们用于管理声明性用户界面上项的位置和大小,非常适合于可调整大小的用户界面。1. Row, Column, Grid, Flow1.1 Row将它的子元素排成一行。Row用于水平排列项目。下面的示例使用Row在外部彩色Rectangle定义的区域中排列三个带有圆角的Rectangle。spacing属性用于设置矩形翻译 2020-12-07 19:29:54 · 260 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第六节:输入处理器
Qt Quick有多种类型可以处理触摸事件,例如我们在上一节中使用的MouseArea,另外还有PinchArea、MultiPointTouchArea和Flickable。上面这些项都存在一些问题。比如MouseArea,Qt只是假设有一个鼠标,对于QMouseEvent和QTouchEvent在Qt Quick中都被认为是的相同事件。这就导致您不能同时与两个MouseArea或Flickable进行交互。对于我们之前使用的MouseArea就意味着您不能同时按下两个按钮或同时拖动两个滑块。也意味着您翻译 2020-12-07 19:25:27 · 353 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第五节:鼠标处理
Qt可以处理不同输入设备的输入,如触摸屏,鼠标等。基本上有两种不同的方法来处理输入事件。一种是区域类型,它可以处理来自任意数量设备的输入和输入处理器。在本章中,我们将介绍鼠标处理类型MouseArea。下一章将讨论一般的输入处理器。1. MouseArea我们可以使用MouseArea来启用鼠标与元素的交互。它是一个不可见的矩形项,可以像下面这样嵌套到元素中来捕捉鼠标事件:Rectangle { width: 100; height: 100 color: "green"翻译 2020-12-05 17:09:01 · 303 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第四节:文本输入与按键处理
1. 焦点为了让对象接收键盘事件,它需要获取焦点。本节我们关注的是文本输入,但任何项目都可以有焦点,从而响应输入,无论是通过键盘还是其他地方。最简单的,如果需要让一个项目获取焦点,可以通过设置focus属性为true来实现。例如:Rectangle { color: "lightsteelblue"; width: 240; height: 25 Text { id: myText } Item { id: keyHandler focus: t翻译 2020-12-04 17:45:04 · 416 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第三节:QML基本类型
1. Qt对象Qt作为QML的类型为其提供了一个全局对象,用于引用Qt中的枚举和函数。如果要使用它,可以直接使用Qt对象调用全局的成员。例如:import QtQuick 2.0Text { color: Qt.rgba(1, 0, 0, 1) text: Qt.md5("hello, world")}请参阅有关Qt QML类型的文档,以及其提供的所有内容。2. RectangleRectangle类型用于用纯色或渐变色填充区域或提供矩形边框。Rectangle要么使用实翻译 2020-12-04 17:42:34 · 346 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第二节:QML类型和属性
在本章的开始部分,我们先对QML类型和代码的结构进行简单的介绍。之后,我们将讨论QML对象属性和QObject属性。1. QML类型和结构QML类型是标记语言中的结构,它们表示可视化和非可视化部分。非可视QML类型包括状态(states)、转换(transitions)、模型(models)、路径(paths)、渐变(gradients)和计时器(timers)等。Qt Quick中的所有可视项都继承自Item,但它本身并不是可见的。使用Item作为顶层QML对象(作为组件的根项目)不会产生视觉效果。翻译 2020-11-30 19:44:01 · 473 阅读 · 0 评论 -
《Qt MOOC系列教程》第三章第一节:QML介绍
我们在前面两章主要介绍了Qt基本模块,它几乎可以用于任何Qt应用程序中,无论该应用程序多么简单或复杂。我们讨论了应用程序逻辑,实现应用程序行为的引擎。然而除了逻辑之外,我们通常还需要创建一个用户界面来与引擎交互,最好是具有一个酷炫且现代化的用户界面。在第三章,我们将讨论使用Qt Quick创建用户界面。我们将使用的编程语言是声明式脚本语言QML,它扩展了JavaScript。虽然可以用JavaScript实现应用程序逻辑,但首选的方法是使用QML和JavaScript来声明UI组件、布局和动画,使用C++翻译 2020-11-30 19:41:51 · 680 阅读 · 0 评论 -
《Qt MOOC系列教程》第二章第四节:父子关系
1. 对象树QObject将自己组织在对象树中。当您以一个对象作为父对象创建QObject时,该对象将被添加到父对象的children()列表中,并在父对象被删除时删除。事实证明,这种方法非常适合GUI编程。例如,QShortcut(键盘快捷方式)是相关窗口的子对象,因此当用户关闭该窗口时,快捷方式也会被删除。QQuickItem是Qt Quick模块的基本可视化元素,我们将在本课程的后面部分讨论它,它继承于QObject,但有一个可视化父元素的概念,它与QObject父元素不同。一个可视化元素不一定与翻译 2020-11-29 11:44:42 · 209 阅读 · 0 评论 -
《Qt MOOC系列教程》第二章第三节:多任务处理
在基于事件的系统中,保持GUI线程的响应并在工作线程中完成所有耗时的任务是很重要的。耗时的任务可能只需要几十毫秒,也可能会执行无限循环。在任何情况下,阻塞函数都不应该延迟GUI线程中的事件处理。1. QThreadQThread是一个以平台无关的方式管理线程的类。线程本身是特定于平台的内核对象。QThread提供了一个API,通过一个平台无关的枚举来设置优先级——setPriority(QThread::priority),启动线程——start(QThread::priority),退出线程事件循环—翻译 2020-11-25 21:44:09 · 590 阅读 · 0 评论 -
《Qt MOOC系列教程》第二章第二节:对象通信:信号和槽
几乎所有的UI工具包都有一种机制来检测用户操作,并对该操作做出响应。其中一些使用回调,另一些使用监听器,但基本上,所有这些都是受观察者模式的启发。观察者模式用于观察对象想要通知其他观察者对象状态变化的情况。下面是一些具体的例子:用户单击了一个按钮,应该会显示一个菜单。一个Web页面刚刚加载完毕,一个进程应该从这个加载的页面中提取一些信息。一个用户正在滚动一个项目列表(例如在一个app store),并到达了终点,所以其他项目应该被加载。观察者模式在GUI应用程序中随处可见,并且常常导致一些样板翻译 2020-11-25 21:40:42 · 366 阅读 · 0 评论 -
《Qt MOOC系列教程》第二章第一节:值对象与QObject
1. 元对象系统Qt的元对象系统为对象间通信、运行时类型信息(RTTI)和动态属性系统提供了信号和槽机制。信号和槽是Qt中最重要的概念之一,我们将在下一章进行讨论。元对象系统通过三种机制实现:QObject 是元对象系统中所有对象继承的基类。Q_OBJECT在类定义中声明时,该宏用于启用元对象功能。元对象编译器(moc)将读取带有已声明的Q_OBJECT宏的类定义,并生成元对象代码。2. 值类型和标识类型值类型可以被复制和赋值。许多Qt值类型,如QString和Qt容器,也使用隐式共享(写翻译 2020-11-23 17:37:23 · 354 阅读 · 0 评论 -
《Qt MOOC系列教程》第一章第三节:容器
1. Qt容器Qt库提供了一组通用的基于模板的容器类。这些类可用于存储指定类型的项。例如,如果您需要一个可调整大小的QString数组可以使用QVector<QString>。这些容器类的设计比STL容器更轻,更安全,更易于使用。如果您不熟悉STL,或者更喜欢以“Qt方式”进行操作,则可以使用这些类而不是STL类。不过也可以使用标准容器。Qt容器类是隐式共享的,它们是可重入的,并且它们针对速度,低内存消耗和最小的内联代码扩展进行了优化,从而可以生成较小的可执行文件。此外,在所有用于访问它们翻译 2020-11-22 21:55:08 · 365 阅读 · 0 评论 -
《Qt MOOC系列教程》第一章第二节:字符串处理和值类型
在这一章中,我们将讨论字符串及其操作,并简要讨论Qt中的值与类型。如果您希望了解更具体的技术细节,我们鼓励您查看官方Qt文档。1. QCharQChar类提供了一个16位的Unicode字符。在Qt中,Unicode字符是没有任何标记或结构的16位实体,这个类表示这样的实体。它是轻量级的,所以可以在任何地方使用。大多数编译器将其视为无符号的short。该类具有许多您期望的方法,例如isNull()和isNumber()。如果您想了解更多的QChar信息,请参阅官方文档。2. QStringQStri翻译 2020-11-22 21:52:33 · 353 阅读 · 0 评论 -
《Qt MOOC系列教程》第一章第一节:创建和调试Qt项目
第一章第一节:创建和调试Qt项目您好!欢迎加入Qt MOOC!本主题涵盖了您在学习本课程时所需的大部分基本知识。我们将从课程的角度,以练习的形式来讨论Qt项目。还会介绍一些重要概念,这些概念将帮助您了解Qt的基础知识。我们使用Qt的官方文档作为辅助材料,这会让您熟悉Qt的官方文档。另外,我们还将讨论构建,qmake和调试信息等。如果所有这些对您来说都已经很熟悉了,你可以直接去完成练习,然后进入更具体的主题。如果您在完成Hello World练习时不知道发生了什么情况,请回来阅读基础知识,我们不会对您有翻译 2020-11-18 09:41:50 · 1075 阅读 · 0 评论 -
《Qt MOOC系列教程》简介
该课程由Qt公司制作并发布于赫尔辛基大学的线上免费课程。Qt中国专业服务工程师Amos负责翻译并整理。该课程当前未运行。感谢所有在新年期间参加该课程的Beta版测试的人。我们将很快回来,敬请期待!当然,您仍然可以仔细阅读材料,但它仍在开发中,因此可能会有修改,恕不另行通知。1. 什么是Qt?编程应该快速,轻松且有趣。随着每天应用程序和设备数量的增长,效率比以往任何时候都变得更加重要。这就是为什么Qt在过去的25年中一直致力于改善软件开发的原因。Qt拥有您所需要的一切,可以快速且经济有效地为任何项翻译 2020-11-16 18:20:30 · 524 阅读 · 0 评论