QT
文章平均质量分 87
枫★曦
Stay simple,stay positive...
展开
-
让你的 Qt 桌面程序看上去更加 native(四):style sheet
<br />临近春节,更新也慢了许多。今天再来写一篇,不知道会不会是春节前的最后一篇了。豆子先祝大家新春愉快!<br />我们知道,HTML 仅仅被定义为一种内容布局的语言。也就是说,HTML 应该做的,是告诉浏览器,这个东西应该放在这里,那个东西应该放在那里。至于这些东西该怎么显示,例如,用红色还是用蓝色,这样的显示的定义应该交给 CSS 去做。所以,在新近版本的 HTML 中,font、color 这样的标签和属性已经不被推荐使用了。同样,在 Qt 中也有这么一个样式表,被称为 style sheet—转载 2011-02-20 09:59:00 · 822 阅读 · 0 评论 -
Qt学习之路(50): QString
<br />这段时间回家,一直没有来得及写,今天才发现博客的编辑器有了新版。还是先来试试新版编辑器的功能吧!<br />今天要说的是QString。之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的。<br />每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构。C++语言提供了两种字符串的实现:C风格的字符串,以'/0‘结尾;转载 2010-09-03 23:27:00 · 543 阅读 · 0 评论 -
Qt学习之路(49): 通用算法
关于Qt的model-view部分就告一段落,今天我们开始新的部分。或许有些朋友觉得前面的部分说得很简单。对此我也没有办法,毕竟,Qt是一个很庞大的库,一时半会根本不可能穷尽所有内容,并且我也有很多东西不知道,有时候也必须去查找资料才能明白。 今天开始的部分是关于Qt提供的一些通用算法。这部分内容来自C++ GUI Programming with Qt 4, 2nd Edition。 <QtAlgorithms>提供了一系列通用的模板函数,用于实现容器上面的基本算法。这部分算法很多依赖于STL风格的遍历器转载 2010-09-03 23:24:00 · 548 阅读 · 0 评论 -
Qt学习之路(47): 自定义Model之三
今天来说的是自定义model中最复杂的例子。这个例子同样也是出自C++ GUI Programming with Qt 4, 2nd Edition这本书。 这个例子是将布尔表达式分析成一棵树。这个分析过程在离散数学中经常遇到,特别是复杂的布尔表达式,类似的分析可以比较方便的进行表达式化简、求值等一系列的计算。同样,这个技术也可以很方便的分析一个表达式是不是一个正确的布尔表达式。在这个例子中,一共有四个类:Node:组成树的节点; BooleaModel:布尔表达式的model,实际上是一个tree mod转载 2010-09-03 23:19:00 · 619 阅读 · 0 评论 -
Qt学习之路(60): 创建shared library
<br />前段时间说了Qt一些类库的使用,今天来换一下口味,来看一下程序设计的问题。今天来说的是关于共享库 shared library。<br />如果你打开一些 Windows 应用程序的目录,你会发现有很多程序的 exe 文件都很小,大约几百K 的样子,并且目录中不仅仅只有一个 exe 文件,还包含着一大堆 dll 文件。这些 dll 其实就是一些共享库,所谓共享库,其实就是一些动态链接库,能够由程序在运行时进行动态加载的库。既然说是共享,那就是说,这些库不仅仅自己的程序可以使用,并且其他程序也可以转载 2010-09-03 23:43:00 · 455 阅读 · 0 评论 -
Qt学习之路(58): 进程间交互
<br />所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。<br />为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获转载 2010-09-03 23:40:00 · 573 阅读 · 0 评论 -
Qt学习之路(56): 二进制文件读写
今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力。常用的IO读写的类包括以下几个:QFlie访问本地文件系统或者嵌入资源QTemporaryFile创建和访问本地文件系统的临时文件QBuffer读写 QByteArrayQProcess运行外部程序,处理进程间通讯QTcpSocketTCP 协议网络数据传输QUdpSocket传输 UDP 报文QSslSocket使用转载 2010-09-03 23:37:00 · 644 阅读 · 0 评论 -
Qt学习之路(55): 剪贴板操作
<br />剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。<br />大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨应用程序数据交互的一种方式。Qt 已经为我们封装好很多关于剪贴板的操作,因此我们可以在自己的应用中很容易的实现。下面还是从代码开始:<br />clipboarddemo.h#ifndef CLIPBOARDDEMO_H #define CLI转载 2010-09-03 23:35:00 · 990 阅读 · 0 评论 -
Qt学习之路(53): 拖放技术之二
很长时间没有来写博客了,前段时间一直在帮同学弄一个 spring-mvc 的项目,今天终于做完了,不过公司里面又要开始做 flex 4,估计还会忙一段时间吧!接着上次的说,上次说到了拖放技术,今天依然是一个例子,同样是来自《C++ GUI Programming with Qt 4, 2nd Edition》的。这次的 demo 还算是比较实用:实现的是两个 list 之间的数据互拖。在很多项目中,这一需求还是比较常见的吧!下面也就算是抛砖引玉了啊!projectlistwidget.h#ifndef PR转载 2010-09-03 23:33:00 · 432 阅读 · 0 评论 -
Qt核心剖析: moc
<br />前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”。这里我们从Qt新增加的关键字就可以看出来:signals、slots 或者 emit。所以有人会觉得 Qt 的程序编译速度慢,这主要是因为在 Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。<br />moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分转载 2010-09-12 13:00:00 · 590 阅读 · 0 评论 -
Qt核心剖析:信息隐藏(2)
<br />下面在上一篇的基础上,我们进入Qt的源代码,看看Qt4.x是如何实现 Private Classes 的。<br /><br />正如前面我们说的,或许你会看到很多类似 Q_D 或者 Q_Q 这类的宏。那么,我们来试着看一下这样的代码:void MyClass::setFoo( int i ) { Q_D(MyClass); d->m_foo = i; } int MyClass::foo() const { Q_D(const MyClass); ret转载 2010-09-12 12:57:00 · 796 阅读 · 0 评论 -
Qt核心剖析:信息隐藏(3)
<br />前面我们已经看到了怎样使用标准的 C++ 代码以及 Qt 提供的 API 来达到信息隐藏这一目标。下面我们来看一下 Qt 是如何实现的。<br />还是以 QObject 的源代码作为例子。先打开 qobject.h,找到 QObjectData 这个类的声明。具体代码如下所示:QObjectData { public: virtual ~QObjectData() = 0; // others }; <br />然后在下面就可以找到 QObject 的声明转载 2010-09-12 12:58:00 · 636 阅读 · 0 评论 -
Qt核心剖析:信息隐藏(1)
<br />如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q。我们的Qt源码之旅就从理解这些宏说起。<br />下面先看一个C++的例子。class Person { public: Person(){} ~Person(){} string name(); void setName(string name); int age(); void setAge(int a)转载 2010-09-12 12:56:00 · 692 阅读 · 0 评论 -
Qt学习之路(44): QSortFilterProxyModel
Qt为我们预定义了很多model,前面已经说过了QStringListModel、QDirModel(也算是Qt推荐使用的QFileSystemModel吧,这个在上一章最后重新加上了一段话,没有注意的朋友去看看哦)。今天我们要说的这个QSortFilterProxyModel并不能单独使用,看它的名字就会知道,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它是用来排序和过滤的。所谓过滤,也就是说按照你输入的内容进行数据的筛选,很像Excel里面的过滤器。不过Qt提供的过滤功能是基于正则表转载 2010-08-14 14:13:00 · 601 阅读 · 0 评论 -
Qt学习之路(43): QDirModel
今天我们来看一个很有用的model:QDirModel。这个model允许我们在view中显示操作系统的目录结构。这次让我们先来看看运行结果: 这个界面很熟悉吧?不过这可不是由QFileDialog打开的哦,这是我们自己实现的。而提供这种实现支持的,就是QDirModel和QTreeView。我们来看一下代码。 mytreeview.h#ifndef MYLISTVIEW_H <br />#define MYLISTVIEW_H <br /><br />#include <QtGui> <br /><br转载 2010-08-14 14:12:00 · 769 阅读 · 1 评论 -
Qt学习之路(42): QStringListModel
今天开始我们要看看Qt的model-view类了。正如前面说的那样,之前三节的item class类只是Qt为了方便我们使用而封装了的一些操作。比起真正的model-view类来,那些类更易于使用,但是功能也会更简单,并且缺少实时性的支持,比如我们并不方便实现插入、删除等一些常见操作。而现在我们要说的model-view类使用起来可能会复杂一些,但是功能强大,并且在model更新时会自动更新view,而model多是一些数据集合,因此比较便于操作。 model-view类中,view大致有三种:list、t转载 2010-08-14 14:11:00 · 558 阅读 · 0 评论 -
Qt学习之路(40): QTreeWidget
前段时间笔记本坏掉了,一直没有更新博客,现在终于修好了啊,还是来继续《Qt学习之路》这个系列吧! 接着前面的内容,今天要说的是另外一个item view class,QTreeWidget。顾名思义,这个类用来展示树型结构。同前面说的QListWidget类似,这个类需要同另外一个辅助类QTreeWidgetItem一同使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用复杂的QTreeView的特性的时候,我们可以直接使用QTreeWidget代替转载 2010-08-14 14:08:00 · 711 阅读 · 0 评论 -
Qt学习之路(39): QListWidget
前面一节简单概述著名的MVC模式在Qt中的实现,现在我们从QListWidget开始了解Qt提供的一系列方便的item view类。 第一个要说的是QListWidget。这个类为我们展示一个List列表的视图。下面还是先看代码: listwidget.h#ifndef LISTWIDGET_H <br />#define LISTWIDGET_H <br /><br />#include <QtGui> <br /><br />class ListWidget : public QWidget <br /转载 2010-08-14 14:06:00 · 843 阅读 · 0 评论 -
Qt学习之路(51): QByteArray和QVariant
<br />前面我们在介绍QString的最后部分曾经提到了QByteArray这个类。现在我们就首先对这个类进行介绍。<br />QByteArray具有类似与QString的API。它也有相应的函数,比如left(), right(), mid()等。这些函数不仅名字和QString一样,而且也具有几乎相同的功能。QByteArray可以存储原生的二进制数据和8位编码的文本数据。这句话怎么理解呢?我们知道,计算机内部所有的数据都是以0和1的形式存储的。这种形式就是二进制。比如一串0、1代码:1000,计转载 2010-09-03 23:29:00 · 609 阅读 · 0 评论 -
Qt学习之路(tip): Qt容器和算法拾遗
<br />Qt提供了另外的容器,比如QPair<T1, T2>,可以存储两个值,类似于std::pair<T1, T2>。还有QVarLengthArray<T, Prealloc>,这是一个QVactor<T>的低级实现。因为它需要预分配内存,并且没有隐式的内存共享机制。但是它的开销低于QVector<T>,更适合资源紧张的情况。<br />关于Qt的通用算法,还有qCopyBackward()和qEqual()两个。具体可以查阅Qt文档中Algorithnms一章。转载 2010-09-03 23:30:00 · 600 阅读 · 0 评论 -
让你的 Qt 桌面程序看上去更加 native(一):简介
<br />《让你的 Qt 桌面程序看上去更加 native》是一个系列文章。在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native。这里,我假设你已经清楚如何使用 Qt 编写桌面应用程序,因为文章中大多都是所谓的“细节”,而有时候恰恰是这些“细节”决定着用户体验。同时,这里的程序都是指桌面程序,不包括各个嵌入式平台。<br />关于 Qt 的介绍这里就不再赘述。这里只说明一点,相比其他的 C++ UI库,Qt 的处理实际上更类似 Java 的 Swing。Qt 的大部分组件都是由转载 2011-02-20 09:52:00 · 1107 阅读 · 0 评论 -
让你的 Qt 桌面程序看上去更加 native(三):自定义 style
前面我们一再强调,Qt 使用自己的方式绘制组件。然而我们也看到,在不同的平台上,Qt 的组件表现也不相同。这和 Swing 有些类似:Swing 使用 look and feel 表现组件的外观,Qt 也是类似的。用来绘制组件外观的类就是 QStyle。 需要说明一点,组件的 style 是一个非常复杂的内容,仅在这里不可能全部讲解清楚。如果需要,还是要自己仔细阅读相关文档。另外,这部分牵扯的类很多,函数也很复杂,步步为营才是最好的对待方法。除非非常必要,还是建议不要轻易去碰 style 这部分。 好了,说转载 2011-02-20 09:55:00 · 916 阅读 · 0 评论 -
让你的 Qt 桌面程序看上去更加 native(二):Style
<br />我们先从 Style 说起。所谓 Style,也就是风格。可以理解成把程序一运行起来,第一眼看上去的的样子,也就是程序的第一印象。这种第一印象往往左右着用户的想法。例如,safari 原本是 Apple 在 MacOS 下的一款浏览器。后来,Apple 把它移植到 Windows 平台,但仍旧保留了 Apple 的外观。这样一来,尽管 safari 看起来很华丽,却与 Windows 的风格格格不入(下图出自 http://www.dtgeeks.com/journals/article/saf转载 2011-02-20 09:54:00 · 816 阅读 · 0 评论 -
让你的 Qt 桌面程序看上去更加 native(五):QDialog
<br />虽然 Nokia 刚刚宣布和微软合作,推出 WP7 的智能手机,现在 IT 界依然一片哗然(不过也是在意料之中),但这并不会影响我们对于 Qt 的兴趣。好了,现在我们来看的是关于 QDialog 的一些东西。<br />首先先来看 QDialog 的一副截图(出自 Qt Developer Day, 2009):<br /><br />在这里,我们要注意的是不同平台之上对话框的按钮的不同。其实这是同一段代码编译的,没有使用条件编译技术。那么是如何做到的呢?答案是使用 QDialogButtonB转载 2011-02-20 10:00:00 · 3224 阅读 · 0 评论 -
Qt 富文本处理(二)
<br />文档元素<br />富文本文档通常包括一些通用的元素,例如段落、框架、表格和列表。这些在 QTextDocument 类中分别使用 QTextBlock,QTextFrame,QTextTable 和 QTextList 描述。不同于文档的其他元素,图片使用一种特殊的文本片段描述,这使得图片可以同普通文本混排。<br />文档的基本构建单位是 QTextBlock 和 QTextFrame。块本身就包含文本片段(QTextFragment),但是这不会直接影响到高层次的文档结构。<br />能够转载 2011-01-03 09:48:00 · 3155 阅读 · 0 评论 -
Qt 富文本处理(一)
<br />最近使用 Qt 做一个离线博客编辑器,因而用到了 Qt 的富文本处理。参考 Qt 的文档,记录下 Qt 的富文本处理的相关技术。文档地址是 http://doc.qt.nokia.com/4.7/richtext.html,本文不是文档的准确翻译,但是内容和文档是基本一致的。<br />新版本 Qt 使用 QTextDocument 类作为富文本处理的中心类。相比之下,老版本则是使用基于文本的标记语言。<br />现在,Qt 操作文档的接口可以分成两类:基于光标的接口(cursor-based转载 2011-01-03 09:47:00 · 3027 阅读 · 0 评论 -
深入理解信号槽(四)
<br />将 Qt 的信号槽系统与 Boost.Signals 结合使用<br />实际上,将 Qt 的信号槽系统与 Boost.Signals 结合在一起使用并非不可能。通过前面的阐述,我们都知道了二者的不同,至于为什么要将这二者结合使用,则是见仁见智的了。这里,我们给出一种结合使用的解决方案,但是并不是说我们暗示应该将它们结合使用。这应该是具体问题具体分析的。<br />将 Qt 的信号槽系统与 Boost.Signals 结合使用,最大的障碍是,Qt 使用预处理器定义了关键字 signals,slo转载 2011-01-03 09:46:00 · 774 阅读 · 0 评论 -
深入理解信号槽(三)
<br />信号槽的实现实例—— Qt 和 Boost<br />Qt 的信号槽和 Boost.Signals 由于有着截然不同的设计目标,因此二者的实现、强度也十分不同。将二者混合在一起使用也不是不可能的,我们将在本系统的最后一部分来讨论这个问题。<br />使用信号槽<br />信号槽是伟大的工具,但是如何能更好的使用它们?相比于直接函数调用,有三点值得我们的注意。一个信号槽的调用:或许会比直接函数调用耗费更多的时间/空间; 可能不能使用 inline; 对于代码阅读者来说可能并不友好。 <br />使转载 2011-01-03 09:44:00 · 741 阅读 · 0 评论 -
深入理解信号槽(二)
<br />多对多<br />下一个问题是,我们能够在点击一次重新载入按钮之后做多个操作吗?也就是让信号和槽实现多对多的关系?<br />实际上,我们只需要利用一个普通的链表,就可以轻松实现这个功能了。比如,如下的实现:class MultiAction :public AbstractAction // ...an action that is composed of zero or more other actions;// executing it is really executing e转载 2010-12-13 21:55:00 · 557 阅读 · 0 评论 -
深入理解信号槽(一)
<br />这篇文章来自于 A Deeper Look at Signals and Slots,Scott Collins 2005.12.19。需要说明的是,我们这里所说的“信号槽”不仅仅是指 Qt 库里面的信号槽,而是站在一个全局的高度,从系统的角度来理解信号槽。所以在这篇文章中,Qt 信号槽仅仅作为一种实现来介绍,我们还将介绍另外一种信号槽的实现——boost::signal。因此,当你在文章中看到一些信号的名字时,或许仅仅是为了描述方便而杜撰的,实际并没有这个信号。<br />什么是信号槽?<br转载 2010-12-13 21:54:00 · 604 阅读 · 0 评论 -
关于虚函数和 Qt 的 Event 函数的简单说明
<br />看到有些留言有问关于虚函数和 Qt 中的各种 event 的相关问题,考虑到留言回复中的种种局限,这里先另起一篇吧。说明一下,这些都是 C++ 面向对象的特性,如果你不明白,应该考虑再多看看 C++ 哦~<br />1. QAbstractTableModel 例子中有很多定义的函数都并未看到被调用,我注意到了这一句话“这个函数在用户编辑数据时会自动调用”说的是 setData() 函数,但是其他的难道也都是?可是这些都是自己定义的函数?系统怎么会知道?<br />2. 像void MyTabl转载 2010-12-13 21:52:00 · 1181 阅读 · 1 评论 -
Qt学习之路(54): 自定义拖放数据对象
前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对象。但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用 QMimeData 可能就没有那么容易了。为了实现这种操作,我们可以从下面三种实现方式中选择一个:将自定义数据作为 QByteArray 对象,使用 QMimeData::setData() 函数作为二进制数据存储到 QMimeD转载 2010-09-03 23:34:00 · 687 阅读 · 0 评论 -
Qt学习之路(48): 自定义委托
好久没有来写文章了,由于家里面宽带断了,所以一直没能更新,今天现在写上一篇。 还是继续前面的内容。前面我们分三次把自定义model说完了,其实主要还是那三个实例。在 model/view 架构中,与model同等重要的就是 view。 我们知道,在经典的 MVC 模型中,view用于向用户展示 model 的数据。但是,Qt提供的不是 MVC 三层架构,而是一个 model/view 设计。这种设计并没有包含一个完整而独立的组件用于管理用户的交互。一般来说,view仅仅是用作对model数据的展示和对用户输转载 2010-09-03 23:22:00 · 562 阅读 · 0 评论 -
Qt学习之路(46): 自定义model之二
前面的例子已经比较清楚的给出了自定义model的方法,就是要覆盖我们所需要的那几个函数就可以了。但是,前面的例子仅仅是简单的展示数据,也就是说数据时只读的。那么,如何能做到读写数据呢?那就要来看进来的例子了。这个例子也是来自C++GUI Programming with Qt 4, 2nd Edition这本书的。 还是先来看代码吧: citymodel.h class CityModel : public QAbstractTableModel <br />{ <br /> Q_OBJECT转载 2010-09-03 23:16:00 · 508 阅读 · 0 评论 -
Qt学习之路(59): 编写跨平台的程序
<br />看到评论里面有朋友抱怨以前文章里面的例子都是 for Windows 的,没有 for Linux 或者 for Mac 的。那么今天就来说说跨平台的问题吧! <br />所谓跨平台,其实有两种含义,一是跨硬件平台,一是跨软件平台。对于硬件平台,很多时候我们都会不自觉的忽略掉,因为硬件差异虽然很大,但是我们能够接触到的却很少。目前 PC 系列基本都是兼容的,并且编译器可能会帮助我们完成这个问题,因此如果你的程序没有用到汇编语言,基本很难考虑到这种跨平台的支持。但是,如果你的程序需要接触到硬件,不转载 2010-09-03 23:41:00 · 430 阅读 · 0 评论 -
Qt学习之路(57): 文本文件读写
<br />二进制文件比较小巧,但是不是人可读的格式。文本文件是一种人可读的格式的文件,为了操作这种文件,我们需要使用QTextStream类。QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。还有一些文本格式,比如XML、HTML,虽然可以由QTextStream生成,但Qt提供了更方便的XML操作类,这里就不包括这部分内容了。<br />QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对程序员是透明的。它也会将换行符进行转换,同样转载 2010-09-03 23:38:00 · 676 阅读 · 0 评论 -
Qt学习之路(52): 拖放技术之一
拖放 Drag and Drop,有时又被称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,并且,操作系统与应用程序之间进行剪贴板的内容交换,也可以被认为是 DnD 的一部分。DnD 其实是由两部分组成的:Drag 和 Drop。Drag 是将被拖放对象“拖动”,Drop 是将被拖放对象“放下”,前者一般是一个按下鼠标的过程,而后者则是一个松开鼠标的过程,这两者之间鼠标一直是被按下的。当然,这只是一种通常的情况,其他情况还是要看应用程序的具转载 2010-09-03 23:31:00 · 460 阅读 · 0 评论 -
Qt学习之路(35): Qt容器类之顺序存储容器
本来计划先来说下model/view的,结果发现model/view涉及到一些关于容器的内容,于是就把容器部分提前了。 容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象,这种对象一般是通用的模板类。C++提供了一套完整的解决方案,成为标准模板库Standard Template Library,也就是我们常说的STL。 Qt提供了它自己的一套容器类,这就是说,在Qt的应用程序中,我们可以使用标准C++的STL,也可以使用Qt的容器类。Qt容器转载 2010-08-14 14:02:00 · 549 阅读 · 0 评论 -
Qt学习之路(32): 一个简易画板的实现(Graphics View)
这一次将介绍如何使用Graphics View来实现前面所说的画板。前面说了很多有关Graphics View的好话,但是没有具体的实例很难说究竟好在哪里。现在我们就把前面的内容使用Graphics View重新实现一下,大家可以对比一下看有什么区别。 同前面相似的内容就不再叙述了,我们从上次代码的基础上进行修改,以便符合我们的需要。首先来看MainWindow的代码: mainwindow.cpp#include "mainwindow.h"<br /><br />MainWindow::MainWind转载 2010-08-14 13:57:00 · 742 阅读 · 0 评论 -
Qt学习之路(31): 一个简易画板的实现(QWidget)
说实话,本来我是没有打算放一个很大的例子的,一则比较复杂,二来或许需要很多次才能说得完。不过,现在已经说完了绘图部分,所以计划还是上一个这样的例子。这里我会只做出一个简单的画板程序,大体上就是能够画直线和矩形吧。这样,我计划分成两种实现,一是使用普通的QWidget作为画板,第二则是使用Graphcis View Framework来实现。因为前面有朋友说不大明白Graphics View的相关内容,所以计划如此。 好了,现在先来看看我们的主体框架。我们的框架还是使用Qt Creator创建一个Gui Ap转载 2010-08-14 13:56:00 · 694 阅读 · 0 评论