Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类. QPainter用来执行绘制的操作:QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间:QPaintEngine提供了画笔(QPainter)…
Qt 学习之路 2(29):绘制设备 豆子 2012年12月3日 Qt 学习之路 2 28条评论 绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说,QPainter可以在任何QPaintDevice的子类上进行绘制.现在,Qt 提供了若干这样的类: Qt4: Qt5: 上面的是 Qt4 的相关类图,下面是 Qt5.这两部分大致相同,只是在 Qt5 中,QGLPixelBuffer已经被废弃.本章我们关注的是QPixmap.QBitmap.QI…
Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻>  --  有需求的话还需要进行专题学习  豆子  2013年11月24日  Qt 学习之路 2  34条评论 前面一章我们简单介绍了如何使用QThread实现线程.现在我们开始详细介绍如何“正确”编写多线程程序.我们这里的大部分内容来自于Qt的一篇Wiki文档,有兴趣的童鞋可以去看原文. 在介绍在以前,我们要认识两个术语: 可重入的(Reentrant):如果多个线程可以在同一时刻调用一个类的所有函数,并且保证每一次函数调用都…
Qt 学习之路 2(33):贪吃蛇游戏(3) 豆子 2012年12月29日 Qt 学习之路 2 16条评论 继续前面一章的内容.上次我们讲完了有关蛇的静态部分,也就是绘制部分.现在,我们开始添加游戏控制的代码.首先我们从最简单的四个方向键开始:     void Snake::moveLeft() { head.rx() -= SNAKE_SIZE; if (head.rx() < -100) { head.rx() = 100; } } void Snake::moveRight() { he…
Qt 学习之路 2(32):贪吃蛇游戏(2) 豆子 2012年12月27日 Qt 学习之路 2 55条评论 下面我们继续上一章的内容.在上一章中,我们已经完成了地图的设计,当然是相当简单的.在我们的游戏中,另外的主角便是蛇和食物.下面我们便开始这部分的开发. 我们的地图是建立在QGraphicsScene的基础之上的,所以,里面的对象应该是QGraphicsItem实例.通常,我们会把所有的图形元素(这里便是游戏中需要的对象,例如蛇.食物等)设计为QGraphicsItem的子类,在这个类中添加…
Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知识综合起来,开发一个贪吃蛇游戏.游戏很简单,相信大家都有见过,多多少少也都玩过.我们在实现这个贪吃蛇游戏时,会利用到事件系统.Graphics View Framework.QPainter 等相关内容,也会了解到一个游戏所具有的一些特性,比如游戏循环等,在 Qt 中如何体现出来.当然,最重要的是,…
Qt 学习之路 2(30):Graphics View Framework 豆子 2012年12月11日 Qt 学习之路 2 27条评论 Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转.我们通常所说的 Linux 的 KDE 桌面环境,就是建立在 Graphics View 基础之上的(尽管新版本的 KDE 有向 QML 迁移的趋势). Graphics View 框架包含了一套完…
Qt 学习之路 2(28):坐标系统 豆子 2012年11月25日 Qt 学习之路 2 59条评论 在经历过实际操作,以及前面一节中我们见到的那个translate()函数之后,我们可以详细了解下 Qt 的坐标系统了.泛泛而谈坐标系统,有时候会觉得枯燥无味,难以理解,好在现在我们已经有了基础. 坐标系统是由QPainter控制的.我们前面说过,QPaintDevice.QPaintEngine和QPainter是 Qt 绘制系统的三个核心类.QPainter用于进行绘制的实际操作:QPaintD…
Home / Qt 学习之路 2 / Qt 学习之路 2(18):事件 Qt 学习之路 2(18):事件  豆子  2012年9月27日  Qt 学习之路 2  60条评论 事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事件则是由系统自动发出,如计时器事件. 事件也就是我们通常说的“事件驱动(event drive)”程序设计的基础概念.事件的出…
Qt 学习之路 2(71):线程简介 豆子 2013年11月18日 Qt 学习之路 2 30条评论 前面我们讨论了有关进程以及进程间通讯的相关问题,现在我们开始讨论线程.事实上,现代的程序中,使用线程的概率应该大于进程.特别是在多核时代,随着 CPU 主频的提升,受制于发热量的限制,CPU 散热问题已经进入瓶颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势.有关线程和进程的区别已经超出了本章的范畴,我们简单提一句,一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,…
Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的,就存在交互的可能性,也就是我们所说的进程间通信(Inter-Process Communication,IPC).不过也正因此,我们的一些简单的交互方式,比如普通的信号槽机制等,并不适用于进程间的相互通信.我们说过,进程是操作系统的基本调度单元,因此,进程间交互不可避免与操作系统的实现息息相关.…
Qt 学习之路 2(67):访问网络(3) 豆子 2013年11月5日 Qt 学习之路 2 16条评论 上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作.本章我们将继续完善前面介绍的天气程序. 注意到我们在WeatherDetail类中有一个icon属性.到现在为止我们还没有用到这个属性.下面我们考虑如何修改我们的程序. 通过查看 OpenWeatherMap 的相关 API 我们可以发现,当我们查询天气时会附带这么一个 icon 属性.这个属性其实是网站上的一个天…
Home / Qt 学习之路 2 / Qt 学习之路 2(66):访问网络(2) Qt 学习之路 2(66):访问网络(2)  豆子  2013年10月31日  Qt 学习之路 2  27条评论 上一章我们了解了NetWorker类的简单实现.不仅如此,我们还提到了几个 C++ 开发时常用的设计模式.这些在接下来得代码中依然会用到. 现在我们先来研究下 OpenWeatherMap 的相关 API.之所以选择 OpenWeatherMap,主要是因为这个网站提供了简洁的 API 接口,非常适合示…
Home / Qt 学习之路 2 / Qt 学习之路 2(65):访问网络(1) Qt 学习之路 2(65):访问网络(1)  豆子  2013年10月11日  Qt 学习之路 2  18条评论 现在的应用程序很少有纯粹单机的.大部分为了各种目的都需要联网操作.为此,Qt 提供了自己的网络访问库,方便我们对网络资源进行访问.本章我们将介绍如何使用 Qt 进行最基本的网络访问. Qt 进行网络访问的类是QNetworkAccessManager,这是一个名字相当长的类,不过使用起来并不像它的名字一…
Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON  豆子  2013年9月23日  Qt 学习之路 2  8条评论 上一章我们了解了如何使用 QJson 处理 JSON 文档.QJson 是一个基于 Qt 的第三方库,适用于 Qt4 和 Qt5 两个版本.不过,如果你的应用仅仅需要考虑兼容 Qt5,其实已经有了内置的处理函数.Qt5 新增加了处理 JSO…
Home / Qt 学习之路 2 / Qt 学习之路 2(63):使用 QJson 处理 JSON Qt 学习之路 2(63):使用 QJson 处理 JSON  豆子  2013年9月9日  Qt 学习之路 2  19条评论 XML 曾经是各种应用的配置和传输的首选方式.但是现在 XML 遇到了一个强劲的对手:JSON.我们可以在这里看到有关 JSON 的语法.总体来说,JSON 的数据比 XML 更紧凑,在传输效率上也要优于 XML.不过 JSON 数据的层次化表达不及 XML,至少不如 X…
Home / Qt 学习之路 2 / Qt 学习之路 2(62):保存 XML Qt 学习之路 2(62):保存 XML  豆子  2013年8月26日  Qt 学习之路 2  9条评论 前面几章我们讨论了读取 XML 文档的三种方法.虽然各有千秋,但是 Qt 推荐的是使用QXmlStreamReader.与此同时,许多应用程序不仅需要读取 XML,还需要写入 XML.为此,Qt 同样提供了三种方法: 使用QXmlStreamWriter: 构造一个 DOM 树,然后掉其save()函数: 使用…
Qt 学习之路 2(61):使用 SAX 处理 XML  豆子  2013年8月13日  Qt 学习之路 2  没有评论 前面两章我们介绍了使用流和 DOM 的方式处理 XML 的相关内容,本章将介绍处理 XML 的最后一种方式:SAX.SAX 是一种读取 XML 文档的标准 API,同 DOM 类似,并不以语言为区别.Qt 的 SAX 类基于 SAX2 的 Java 实现,不过具有一些必要的名称上的转换.相比 DOM,SAX 的实现更底层因而处理起来通常更快.但是,我们前面介绍的QXmlStr…
Qt 学习之路 2(60):使用 DOM 处理 XML  豆子  2013年8月3日  Qt 学习之路 2  9条评论 DOM 是由 W3C 提出的一种处理 XML 文档的标准接口.Qt 实现了 DOM Level 2 级别的不验证读写 XML 文档的方法. 与上一章所说的流的方式不同,DOM 一次性读入整个 XML 文档,在内存中构造为一棵树(被称为 DOM 树).我们能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XM…
Qt 学习之路 2(59):使用流处理 XML 豆子 2013年7月25日 Qt 学习之路 2 18条评论 本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续使用 XML).XML 由 World Wide Web Consortium…
Qt 学习之路 2(58):编辑数据库外键(skip) 豆子 2013年7月12日 Qt 学习之路 2 13条评论 前面几章我们介绍了如何对数据库进行操作以及如何使用图形界面展示数据库数据.本章我们将介绍如何对数据库的数据进行编辑. 当然,我们可以选择直接使用 SQL 语句进行更新,这一点同前面所说的 model/view 的编辑没有什么区别.除此之外,Qt 还为图形界面提供了更方便的展示并编辑的功能. 普通数据的编辑很简单,这里不再赘述.不过,我们通常会遇到多个表之间存在关联的情况.首先我们要…
Qt 学习之路 2(57):可视化显示数据库数据(skip) 豆子 2013年6月26日 Qt 学习之路 2 26条评论 前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSqlQuery的方式更灵活,功能更强大,而使用QSqlTableModel则更简单,更方便与 model/view 结合使用(数据库应用很大一部分就是以表格形式显示出来,这正是 model/view 的强项).本章我们简单介绍使用QSqlTableModel显示数据的方法.当然,我们也可以选择使用QS…
Qt 学习之路 2(56):使用模型操作数据库 (okgogo: skip) 豆子 2013年6月20日 Qt 学习之路 2 13条评论 前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单的 CREATE.SELECT 等语句的使用.我们也提到过,Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式.这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可…
Qt 学习之路 2(54):剪贴板 豆子 2013年6月8日 Qt 学习之路 2 2条评论 剪贴板的操作经常和前面所说的拖放技术在一起使用.大家对剪贴板都很熟悉.我们可以简单地把它理解成一个数据存储池,外面的 数据可以存进去,里面数据也可以取出来.剪贴板是由操作系统维护的,所以这提供了跨应用程序的数据交互的一种方式.Qt 已经为我们封装好很多关于剪贴板的操作,我们可以在自己的应用中很容易实现对剪贴板的支持,代码实现起来也是很简单的:   class ClipboardDemo : public…
Qt 学习之路 2(53):自定义拖放数据 豆子  2013年5月26日  Qt 学习之路 2  13条评论上一章中,我们的例子使用系统提供的拖放对象QMimeData进行拖放数据的存储.比如使用QMimeData::setText()创建文本,使用QMimeData::urls()创建 URL 对象等.但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用QMimeData可能就没有那么容易了.为了实现这种操作,我们可以从下面三种实现方式中选择一个: 将自定义数据作为QB…
Qt 学习之路 2(52):使用拖放 豆子 2013年5月21日 Qt 学习之路 2 17条评论 拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术.它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制.操作系统与应用程序之间进行的剪贴板内容的交换,也可以被认为是拖放的一部分. 拖放其实是由两部分组成的:拖动和释放.拖动是将被拖放对象进行移动,释放是将被拖放对象放下.前者是一个按下鼠标按键并移动的过程,后者是一个松开鼠标按键的过程:通常这两…
Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 C++ GUI Programming with Qt 4, 2nd Edition 这本书的布尔表达式树模型的示例相当精彩,复杂而又不失实用性,所以我们还是以这个例子结束这部分内容. 这个例子是将布尔表达式分析成一棵树.这个分析过程在离散数学中经常遇到,特别是复杂的布尔表达式.类似的分析方法可以套…
Qt 学习之路 2(48):QSortFilterProxyModel 豆子 2013年4月11日 Qt 学习之路 2 6条评论 从本章开始,我们将逐步了解有关自定义模型的相关内容.尽管前面我们曾经介绍过 Qt 提供的几个内置模型:QStringListModel和QFileSystemModel,但对于千变万化的需求而言,这些显然是远远不够的.于是,Qt 也允许我们对模型进行自定义. 在正式开始介绍自定义模形之前,我们先来了解一个新的类:QSortFilterProxyModel.之所以将这个…
Home / Qt 学习之路 2 / Qt 学习之路 2(46):视图和委托 Qt 学习之路 2(46):视图和委托  豆子  2013年3月11日  Qt 学习之路 2  63条评论 前面我们介绍了模型的概念.下面则是另外一个基本元素:视图.在 model/view 架构中,视图是数据从模型到最终用户的途径.数据通过视图向用户进行显示.此时,这种显示方式不必须同模型的存储结构相一致.实际上,很多情况下,数据的显示同底层数据的存储是完全不同的. 我们使用QAbstractItemModel提供标…
Home / Qt 学习之路 2 / Qt 学习之路 2(44):QFileSystemModel Qt 学习之路 2(44):QFileSystemModel  豆子  2013年2月21日  Qt 学习之路 2  29条评论 上一章我们详细了解了QStringListModel.本章我们将再来介绍另外一个内置模型:QFileSystemModel.看起来,QFileSystemModel比QStringListModel要复杂得多:事实也是如此.但是,虽然功能强大,QFileSystemMo…