亭台六七座
大圣,此去欲何?踏南天,碎凌霄。若一去不回...?便一去不回!
展开
-
Qt 学习之路 2(47):视图选择
选择是视图中常用的一个操作。在列表、树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色。在 Qt 中,选择也是使用了一种模型。在 model/view 架构中,这种选择模型提供了一种更通用的对选择操作的描述。对于一般应用而言,Qt 内置的选择模型已经足够,但是,Qt 还是允许你创建自己的选择模型,来实现一些特殊的操作。Qt 使用QItemSelectionMode转载 2017-09-27 15:10:38 · 426 阅读 · 0 评论 -
Qt 学习之路 2(86):QML视图代理
与 Qt model/view 架构类似,在自定义用户界面中,代理扮演着重要的角色。模型中的每一个数据项都要通过一个代理向用户展示,事实上,用户看到的可视部分就是代理。每一个代理都可以访问一系列属性和附加属性。这些属性及附加属性中,有些来自于数据模型,有些则来自于视图。前者为代理提供了每一个数据项的数据信息;后者则是有关视图的状态信息。代理中最常用到的是来自于视图的附加转载 2017-10-09 00:07:45 · 1127 阅读 · 0 评论 -
Qt 学习之路 2(87):模型-视图高级技术
PathViewPathView是 QtQuick 中最强大的视图,同时也是最复杂的。PathView允许创建一种更灵活的视图。在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局。沿着同一布局路径,数据项的属性可以被更详细的设置,例如缩放、透明度等。使用PathView首先需要定义一个代理和一个路径。除此之外,PathView还可以设置很多其它属性,其中最普遍的是转载 2017-10-09 00:09:03 · 433 阅读 · 0 评论 -
Qt 学习之路 2(88):Canvas
在 QML 刚刚被引入到 Qt 4 的那段时间,人们往往在讨论 Qt Quick 是不是需要一个椭圆组件。由此,人们又联想到,是不是还需要其它的形状?这种没玩没了的联想导致了一个最直接的结果:除了圆角矩形,Qt Quick 什么都没有提供,包括椭圆。如果你需要一个椭圆,那就找个图片,或者干脆自己用 C++ 写一个吧(反正 Qt Quick 是可以扩展的,不是么)!为了使用脚本化的绘图机制,转载 2017-10-09 00:10:34 · 5659 阅读 · 0 评论 -
Qt 学习之路 2(89):Canvas(续)
变换Canvas中的“变形”,主要指的是坐标系的变换,而不是路径的变换。这与 QML 元素变换非常相似,都可以实现坐标系统的scale(缩放)、rotate(旋转)和translate(平移);不同的是,变换的原点是画布原点。例如,如果以一个路径的中心点为定点进行缩放,那么,你需要现将画布原点移动到路径中心点。我们也可以使用变换函数实现复杂的变换。理解“变换是针对坐标系的”这一点非常重要,转载 2017-10-09 00:11:41 · 1678 阅读 · 0 评论 -
Qt 学习之路 2(90):粒子系统
粒子系统是一种计算机图形学的技术,用于模拟一些特定的模糊现象,这些现象用传统的渲染技术难以达到一定的真实感。虽然名为“粒子”,但却可以模拟爆炸、烟、水流、落叶、云、雾、流星尾迹或其它发光轨迹这样的抽象视觉效果。粒子系统的特色是“模糊”,其渲染效果并非完全取决于像素,而是使用特定的边界参数描述随机粒子。幸运的是,使用 QML 可以很方便的实现粒子系统。粒子系统的核心是ParticleSy转载 2017-10-09 00:14:06 · 366 阅读 · 0 评论 -
Qt 学习之路 2(91):粒子系统(续)
粒子的旋转作用于每一个粒子,除此之外,我们还可以设置粒子轨迹的方向。轨迹取决于一个指定的向量空间,该向量空间定义了粒子的速度和加速度,以及一个随机的方向。QML 提供了三个不同的向量空间,用于定义粒子的速度和加速度:PointDirection:使用 x 和 y 值定义的方向AngleDirection:使用角度定义的方向TargetDirection:使用一个目标点坐标定义的转载 2017-10-09 11:38:30 · 292 阅读 · 0 评论 -
Qt 学习之路 2(48):QSortFilterProxyModel
从本章开始,我们将逐步了解有关自定义模型的相关内容。尽管前面我们曾经介绍过 Qt 提供的几个内置模型:QStringListModel和QFileSystemModel,但对于千变万化的需求而言,这些显然是远远不够的。于是,Qt 也允许我们对模型进行自定义。在正式开始介绍自定义模形之前,我们先来了解一个新的类:QSortFilterProxyModel。之所以将这个类放在这里,是因为在转载 2017-09-30 22:09:21 · 334 阅读 · 0 评论 -
Qt 学习之路 2(49):自定义只读模型
model/view 模型将数据与视图分割开来,也就是说,我们可以为不同的视图,QListView、QTableView和QTreeView提供一个数据模型,这样我们可以从不同角度来展示数据的方方面面。但是,面对变化万千的需求,Qt 预定义的几个模型是远远不能满足需要的。因此,我们还必须自定义模型。类似QAbstractView类之于自定义视图,QAbstractItemModel 为转载 2017-09-30 22:11:10 · 206 阅读 · 0 评论 -
Qt 学习之路 2(50):自定义可编辑模型
上一章我们了解了如何自定义只读模型。顾名思义,只读模型只能够用于展示只读数据,用户不能对其进行修改。如果允许用户修改数据,则应该提供可编辑的模型。可编辑模型与只读模型非常相似,至少在展示数据方面几乎是完全一样的,所不同的是可编辑模型需要提供用户编辑数据后,应当如何将数据保存到实际存储值中。我们还是利用上一章的CurrencyModel,在此基础上进行修改。相同的代码这里不再赘述,我转载 2017-09-30 22:14:07 · 592 阅读 · 0 评论 -
Qt 学习之路 2(85):动态视图
Repeater适用于少量的静态数据集。但是在实际应用中,数据模型往往是非常复杂的,并且数量巨大。这种情况下,Repeater并不十分适合。于是,QtQuick 提供了两个专门的视图元素:ListView和GridView。这两个元素都继承自Flickable,因此允许用户在一个很大的数据集中进行移动。同时,ListView和GridView能够复用创建的代理,这意味着,ListView和Gr转载 2017-10-09 00:02:39 · 325 阅读 · 0 评论 -
Qt 学习之路 2(84):Repeater
我们介绍过模型视图。这是一种数据和显示相分离的技术,在 Qt 中有着非常重要的地位。在 QtQuick 中,数据和显示的分离同样也是利用这种“模型-视图”技术实现的。对于每一个视图,数据元素的可视化显示交给代理完成。与 Qt/C++ 类似,QtQuick 提供了一系列预定义的模型和视图。本章开始,我们着重介绍这部分内容。这部分内容主要来自http://qmlbook.org/ch06/index.转载 2017-10-09 00:01:12 · 930 阅读 · 0 评论 -
Qt 学习之路 2(75):线程总结
前面我们已经详细介绍过有关线程的一些值得注意的事项。现在我们开始对线程做一些总结。有关线程,你可以做的是:在QThread子类添加信号。这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送者的线程依附性没有关系)不应该做的是:调用moveToThread(this)函数指定连接类型:这通常意味着你正在做错误的事情,比如将QThread控制接口转载 2017-10-07 09:57:50 · 288 阅读 · 0 评论 -
Qt 学习之路 2(76):QML 和 QtQuick 2
前面我们已经了解了 Qt 的一部分内容。这部分内容全部集中在 C++ 方面。也就是说,至今为止我们的程序都是使用 C++ 语言完成的。这在 Qt 5 之前的版本中是唯一的途径。不过,自从 Qt 5 开始,情况有了变化。事实上,从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的转载 2017-10-07 10:00:37 · 4490 阅读 · 0 评论 -
Qt 学习之路 2(77):QML 语法
前面我们已经见识过 QML 文档。一个 QML 文档分为 import 和对象声明两部分。如果你要使用 Qt Quick,就需要 import QtQuick 2。QML 是一种声明语言,用于描述程序界面。QML 将用户界面分解成一块块小的元素,每一元素都由很多组件构成。QML 定义了用户界面元素的外观和行为;更复杂的逻辑则可以结合 JavaScript 脚本实现。这有点类似于 HTML 和 Ja转载 2017-10-07 10:03:29 · 1505 阅读 · 0 评论 -
Qt 学习之路 2(78):QML 基本元素
QML 基本元素可以分为可视元素和不可视元素两类。可视元素(例如前面提到过的Rectangle)具有几何坐标,会在屏幕上占据一块显示区域。不可视元素(例如Timer)通常提供一种功能,这些功能可以作用于可视元素。本章我们将会集中介绍集中最基本的可视元素:Item、Rectangle、Text、Image和MouseArea。Item是所有可视元素中最基本的一个。它是所有其它可视转载 2017-10-07 10:06:42 · 334 阅读 · 0 评论 -
Qt 学习之路 2(79):QML 组件
前面我们简单介绍了几种 QML 的基本元素。QML 可以由这些基本元素组合成一个复杂的元素,方便以后我们的重用。这种组合元素就被称为组件。组件就是一种可重用的元素。QML 提供了很多方法来创建组件。不过,本章我们只介绍一种方式:基于文件的组件。基于文件的组件将 QML 元素放置在一个单独的文件中,然后给这个文件一个名字。以后我们就可以通过这个名字来使用这个组件。例如,如果有一个文件名为 Butto转载 2017-10-07 10:09:43 · 286 阅读 · 0 评论 -
Qt 学习之路 2(80):定位器
QML 提供了很多用于定位的元素。这些元素叫做定位器,都包含在 QtQuick 模块。这些定位器主要有 Row、Column、Grid和Flow等。为了介绍定位器,我们先添加三个简单的组件用于演示:首先是RedRectangle,RedRectangle12345转载 2017-10-07 10:11:38 · 917 阅读 · 0 评论 -
Qt 学习之路 2(81):QML元素布局
上一章我们介绍了 QML 中用于定位的几种元素,被称为定位器。除了定位器,QML 还提供了另外一种用于布局的机制。我们将这种机制成为锚点(anchor)。锚点允许我们灵活地设置两个元素的相对位置。它使两个元素之间形成一种类似于锚的关系,也就是两个元素之间形成一个固定点。锚点的行为类似于一种链接,它要比单纯地计算坐标改变更强。由于锚点描述的是相对位置,所以在使用锚点时,我们必须指定两个元素,声明其中转载 2017-10-08 23:57:20 · 376 阅读 · 0 评论 -
Qt 学习之路 2(82):QML输入元素
前面的章节中,我们看到了作为输入元素的MouseArea,用于接收鼠标的输入。下面,我们再来介绍关于键盘输入的两个元素:TextInput和TextEdit。TextInput是单行的文本输入框,支持验证器、输入掩码和显示模式等。12345678910111213转载 2017-10-08 23:58:28 · 430 阅读 · 0 评论 -
Qt 学习之路 2(83):Qt Quick Controls
自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位。很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮、菜单等。虽然移动领域,这些组件已经变得可有可无,但在桌面系统中依然不可或缺。为了解决这一问题,Qt 5.1 发布了 Qt Quick 的一个全新模块:Qt Quick Controls。顾名思义,这个模块提供了大量类似 Qt Widge转载 2017-10-08 23:59:52 · 842 阅读 · 0 评论 -
Qt 学习之路 2(51):布尔表达式树模型
本章将会是自定义模型的最后一部分。原本打算结束这部分内容,不过实在不忍心放弃这个示例。来自于 C++ GUI Programming with Qt 4, 2nd Edition 这本书的布尔表达式树模型的示例相当精彩,复杂而又不失实用性,所以我们还是以这个例子结束这部分内容。这个例子是将布尔表达式分析成一棵树。这个分析过程在离散数学中经常遇到,特别是复杂的布尔表达式。类似的分析方转载 2017-09-30 22:16:02 · 734 阅读 · 0 评论 -
Qt 学习之路 2(52):使用拖放
拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制。操作系统与应用程序之间进行的剪贴板内容的交换,也可以被认为是拖放的一部分。拖放其实是由两部分组成的:拖动和释放。拖动是将被拖放对象进行移动,释放是将被拖放对象放下。前者是一个按下鼠标按键并移动的过程,后者是一个松开鼠标按键转载 2017-09-30 22:17:27 · 282 阅读 · 0 评论 -
Qt 学习之路 2(53):自定义拖放数据
上一章中,我们的例子使用系统提供的拖放对象QMimeData进行拖放数据的存储。比如使用QMimeData::setText()创建文本,使用QMimeData::urls()创建 URL 对象等。但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用QMimeData可能就没有那么容易了。为了实现这种操作,我们可以从下面三种实现方式中选择一个:将自定义数据作转载 2017-09-30 22:19:51 · 440 阅读 · 0 评论 -
Qt 学习之路 2(65):访问网络(1)
现在的应用程序很少有纯粹单机的。大部分为了各种目的都需要联网操作。为此,Qt 提供了自己的网络访问库,方便我们对网络资源进行访问。本章我们将介绍如何使用 Qt 进行最基本的网络访问。Qt 进行网络访问的类是QNetworkAccessManager,这是一个名字相当长的类,不过使用起来并不像它的名字一样复杂。为了使用网络相关的类,你需要在 pro 文件中添加QT += network。转载 2017-10-05 21:11:38 · 439 阅读 · 0 评论 -
Qt 学习之路 2(66):访问网络(2)
上一章我们了解了NetWorker类的简单实现。不仅如此,我们还提到了几个 C++ 开发时常用的设计模式。这些在接下来得代码中依然会用到。现在我们先来研究下 OpenWeatherMap 的相关 API。之所以选择 OpenWeatherMap,主要是因为这个网站提供了简洁的 API 接口,非常适合示例程序,并且其开发也不需要额外申请 App ID。OpenWeatherMap 的 A转载 2017-10-05 21:14:31 · 464 阅读 · 1 评论 -
Qt 学习之路 2(67):访问网络(3)
上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作。本章我们将继续完善前面介绍的天气程序。注意到我们在WeatherDetail类中有一个icon属性。到现在为止我们还没有用到这个属性。下面我们考虑如何修改我们的程序。通过查看 OpenWeatherMap 的相关 API 我们可以发现,当我们查询天气时会附带这么一个 icon 属性。这个属性其实是网转载 2017-10-05 21:20:10 · 392 阅读 · 0 评论 -
Qt 学习之路 2(68):访问网络(4)
前面几章我们了解了如何使用QNetworkAccessManager 访问网络。在此基础上,我们已经实现了一个简单的查看天气的程序。在这个程序中,我们使用QNetworkAccessManager进行网络的访问,从一个网络 API 获取某个城市的当前天气状况。如果你仔细观察就会发现,即便我们没有添加任何相关代码,QNetworkAccessManager的网络访问并不会阻塞 G转载 2017-10-05 21:23:02 · 267 阅读 · 1 评论 -
Qt 学习之路 2(69):进程
进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。在 Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。转载 2017-10-05 21:25:03 · 296 阅读 · 0 评论 -
Qt 学习之路 2(70):进程间通信
上一章我们了解了有关进程的基本知识。我们将进程理解为相互独立的正在运行的程序。由于二者是相互独立的,就存在交互的可能性,也就是我们所说的进程间通信(Inter-Process Communication,IPC)。不过也正因此,我们的一些简单的交互方式,比如普通的信号槽机制等,并不适用于进程间的相互通信。我们说过,进程是操作系统的基本调度单元,因此,进程间交互不可避免与操作系统的实现息息相关。转载 2017-10-05 21:28:04 · 392 阅读 · 0 评论 -
Qt 学习之路 2(71):线程简介
前面我们讨论了有关进程以及进程间通讯的相关问题,现在我们开始讨论线程。事实上,现代的程序中,使用线程的概率应该大于进程。特别是在多核时代,随着 CPU 主频的提升,受制于发热量的限制,CPU 散热问题已经进入瓶颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势。有关线程和进程的区别已经超出了本章的范畴,我们简单提一句,一个进程可以有一个或更多线程同时运行。线程可以看做是“轻量级进程”,转载 2017-10-05 21:31:12 · 246 阅读 · 0 评论 -
Qt 学习之路 2(72):线程和事件循环
前面一章我们简单介绍了如何使用QThread实现线程。现在我们开始详细介绍如何“正确”编写多线程程序。我们这里的大部分内容来自于Qt的一篇Wiki文档,有兴趣的童鞋可以去看原文。在介绍在以前,我们要认识两个术语:可重入的(Reentrant):如果多个线程可以在同一时刻调用一个类的所有函数,并且保证每一次函数调用都引用一个唯一的数据,就称这个类是可重入的(Reentrant转载 2017-10-05 21:34:30 · 438 阅读 · 0 评论 -
Qt 学习之路 2(73):Qt 线程相关类
希望上一章有关事件循环的内容还没有把你绕晕。本章将重新回到有关线程的相关内容上面来。在前面的章节我们了解了有关QThread类的简单使用。不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必要再三强调使用线程一定要万分小心,一不留神就会陷入陷阱。事实上,Qt 对线程的支持可以追溯到2000年9月22日发布的 Qt 2.2。在这个版本中,Qt 引入了QThread。不过,当时对线程转载 2017-10-05 21:36:58 · 264 阅读 · 0 评论 -
Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
上一章我们了解了如何使用 QJson 处理 JSON 文档。QJson 是一个基于 Qt 的第三方库,适用于 Qt4 和 Qt5 两个版本。不过,如果你的应用仅仅需要考虑兼容 Qt5,其实已经有了内置的处理函数。Qt5 新增加了处理 JSON 的类,与 XML 类库类似,均以 QJson 开头,在 QtCore 模块中,不需要额外引入其它模块。Qt5 新增加六个相关类:QJso转载 2017-10-02 11:57:17 · 2008 阅读 · 0 评论 -
Qt 学习之路 2(63):使用 QJson 处理 JSON
XML 曾经是各种应用的配置和传输的首选方式。但是现在 XML 遇到了一个强劲的对手:JSON。我们可以在这里看到有关 JSON 的语法。总体来说,JSON 的数据比 XML 更紧凑,在传输效率上也要优于 XML。不过 JSON 数据的层次化表达不及 XML,至少不如 XML 那样突出。不过这并不会阻止 JSON 的广泛应用。一个典型的 JSON 文档可以像下面的例子:转载 2017-10-02 11:47:54 · 582 阅读 · 0 评论 -
Qt 学习之路 2(54):剪贴板
剪贴板的操作经常和前面所说的拖放技术在一起使用。大家对剪贴板都很熟悉。我们可以简单地把它理解成一个数据存储池,外面的数据可以存进去,里面数据也可以取出来。剪贴板是由操作系统维护的,所以这提供了跨应用程序的数据交互的一种方式。Qt 已经为我们封装好很多关于剪贴板的操作,我们可以在自己的应用中很容易实现对剪贴板的支持,代码实现起来也是很简单的:转载 2017-09-30 22:24:54 · 461 阅读 · 0 评论 -
Qt 学习之路 2(56):使用模型操作数据库
前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单的 CREATE、SELECT 等语句的使用。我们也提到过,Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求。本章我们将介绍Q转载 2017-10-02 10:46:01 · 323 阅读 · 0 评论 -
Qt 学习之路 2(57):可视化显示数据库数据
前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法。显然,使用QSqlQuery的方式更灵活,功能更强大,而使用QSqlTableModel则更简单,更方便与 model/view 结合使用(数据库应用很大一部分就是以表格形式显示出来,这正是 model/view 的强项)。本章我们简单介绍使用QSqlTableModel显示数据的方法。当然,我们也可以选择使用QSqlQuery获取转载 2017-10-02 10:51:25 · 1054 阅读 · 0 评论 -
Qt 学习之路 2(58):编辑数据库外键
前面几章我们介绍了如何对数据库进行操作以及如何使用图形界面展示数据库数据。本章我们将介绍如何对数据库的数据进行编辑。当然,我们可以选择直接使用 SQL 语句进行更新,这一点同前面所说的 model/view 的编辑没有什么区别。除此之外,Qt 还为图形界面提供了更方便的展示并编辑的功能。普通数据的编辑很简单,这里不再赘述。不过,我们通常会遇到多个表之间存在关联的情况。首先我们要提供转载 2017-10-02 11:01:39 · 1021 阅读 · 0 评论 -
Qt 学习之路 2(59):使用流处理 XML
XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续使用 XML)。XML 由 World Wide Web Consortium(W3C)发布,作为 SHML(Standard Generalized转载 2017-10-02 11:20:11 · 524 阅读 · 0 评论