自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

转载 Qt学习之路(60): 创建shared library

前段时间说了Qt一些类库的使用,今天来换一下口味,来看一下程序设计的问题。今天来说的是关于共享库 shared library。如果你打开一些 Windows 应用程序的目录,你会发现有很多程序的 exe 文件都很小,大约几百K 的样子,并且目录中不仅仅只有一个 exe 文件,还包含着一大堆 dll 文件。这些 dll 其实就是一些共享库,所谓共享库,其实就是一些动态链接库,能够由程序在运

2012-10-09 15:56:46 430

转载 Qt学习之路(59): 编写跨平台的程序

看到评论里面有朋友抱怨以前文章里面的例子都是 for Windows 的,没有 for Linux 或者 for Mac 的。那么今天就来说说跨平台的问题吧!所谓跨平台,其实有两种含义,一是跨硬件平台,一是跨软件平台。对于硬件平台,很多时候我们都会不自觉的忽略掉,因为硬件差异虽然很大,但是我们能够接触到的却很少。目前 PC 系列基本都是兼容的,并且编译器可能会帮助我们完成这个问题,因此如果

2012-10-09 15:55:37 403

转载 Qt学习之路(58): 进程间交互

所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令

2012-10-09 15:55:10 390

转载 Qt学习之路(57): 文本文件读写

二进制文件比较小巧,但是不是人可读的格式。文本文件是一种人可读的格式的文件,为了操作这种文件,我们需要使用QTextStream类。QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。还有一些文本格式,比如XML、HTML,虽然可以由QTextStream生成,但Qt提供了更方便的XML操作类,这里就不包括这部分内容了。QTextStream会自动将 Unic

2012-10-09 15:54:14 342

转载 Qt学习之路(56): 二进制文件读写

今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力。常用的IO读写的类包括以下几个:QFlie访问本地文件系统或者嵌入资源QTemporaryFile创建和访问本地文件系统的临时文件QBuffer读写 QByt

2012-10-09 15:53:35 535

转载 Qt学习之路(55): 剪贴板操作

剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨应用程序数据交互的一种方式。Qt 已经为我们封装好很多关于剪贴板的操作,因此我们可以在自己的应用中很容易的实现。下面还是从代码开始:clipboard

2012-10-09 15:51:23 514

转载 Qt学习之路(54): 自定义拖放数据对象

前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对象。但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用 QMimeData 可能就没有那么容易了。为了实现这种操作,我们可以从下面三种实现方式中选择一个:将自定义数据

2012-10-09 15:50:38 489

转载 Qt学习之路(53): 拖放技术之二

很长时间没有来写博客了,前段时间一直在帮同学弄一个 spring-mvc 的项目,今天终于做完了,不过公司里面又要开始做 flex 4,估计还会忙一段时间吧!接着上次的说,上次说到了拖放技术,今天依然是一个例子,同样是来自《C++ GUI Programming with Qt 4, 2nd Edition》的。这次的 demo 还算是比较实用:实现的是两个 list 之间的数据互拖。在很

2012-10-09 15:49:41 396

转载 Qt学习之路(52): 拖放技术之一

拖放 Drag and Drop,有时又被称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,并且,操作系统与应用程序之间进行剪贴板的内容交换,也可以被认为是 DnD 的一部分。DnD 其实是由两部分组成的:Drag 和 Drop。Drag 是将被拖放对象“拖动”,Drop 是将被拖放对象“放下”,前者一般是一个按下鼠标的过程,

2012-10-09 15:48:47 1044

转载 Qt学习之路(tip): Qt容器和算法拾遗

Qt提供了另外的容器,比如QPair,可以存储两个值,类似于std::pair。还有QVarLengthArray,这是一个QVactor的低级实现。因为它需要预分配内存,并且没有隐式的内存共享机制。但是它的开销低于QVector,更适合资源紧张的情况。关于Qt的通用算法,还有qCopyBackward()和qEqual()两个。具体可以查阅Qt文档中Algorithnms一章。本文出自

2012-10-09 15:47:50 456

转载 Qt学习之路(51): QByteArray和QVariant

前面我们在介绍QString的最后部分曾经提到了QByteArray这个类。现在我们就首先对这个类进行介绍。QByteArray具有类似与QString的API。它也有相应的函数,比如left(), right(), mid()等。这些函数不仅名字和QString一样,而且也具有几乎相同的功能。QByteArray可以存储原生的二进制数据和8位编码的文本数据。这句话怎么理解呢?我们知道,计算机

2012-10-09 15:46:56 519

转载 Qt学习之路(50): QString

这段时间回家,一直没有来得及写,今天才发现博客的编辑器有了新版。还是先来试试新版编辑器的功能吧!今天要说的是QString。之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的。每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用

2012-10-09 15:45:47 426

转载 Qt学习之路(49): 通用算法

关于Qt的model-view部分就告一段落,今天我们开始新的部分。或许有些朋友觉得前面的部分说得很简单。对此我也没有办法,毕竟,Qt是一个很庞大的库,一时半会根本不可能穷尽所有内容,并且我也有很多东西不知道,有时候也必须去查找资料才能明白。今天开始的部分是关于Qt提供的一些通用算法。这部分内容来自C++ GUI Programming with Qt 4, 2nd Edition。

2012-10-09 15:45:15 394

转载 Qt学习之路(48): 自定义委托

好久没有来写文章了,由于家里面宽带断了,所以一直没能更新,今天现在写上一篇。还是继续前面的内容。前面我们分三次把自定义model说完了,其实主要还是那三个实例。在 model/view 架构中,与model同等重要的就是 view。我们知道,在经典的 MVC 模型中,view用于向用户展示 model 的数据。但是,Qt提供的不是 MVC 三层架构,而是一个 model/view

2012-10-09 15:44:21 517

转载 Qt学习之路(47): 自定义Model之三

今天来说的是自定义model中最复杂的例子。这个例子同样也是出自C++ GUI Programming with Qt 4, 2nd Edition这本书。这个例子是将布尔表达式分析成一棵树。这个分析过程在离散数学中经常遇到,特别是复杂的布尔表达式,类似的分析可以比较方便的进行表达式化简、求值等一系列的计算。同样,这个技术也可以很方便的分析一个表达式是不是一个正确的布尔表达式。在这个例子中

2012-10-09 15:43:36 402

转载 Qt学习之路(46): 自定义model之二

前面的例子已经比较清楚的给出了自定义model的方法,就是要覆盖我们所需要的那几个函数就可以了。但是,前面的例子仅仅是简单的展示数据,也就是说数据时只读的。那么,如何能做到读写数据呢?那就要来看进来的例子了。这个例子也是来自C++GUI Programming with Qt 4, 2nd Edition这本书的。还是先来看代码吧:citymodel.hclass

2012-10-09 15:42:05 439

转载 Qt学习之路(45): 自定义model之一

前面我们说了Qt提供的几个预定义model。但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的。另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说,可能这个model中的某些功能你永远也不会用到,但是还要带着它,这样做的后果就是效率不会很高。所以,我们还必须要能够自定义model。在我们真正的完成自定义model之前,先来看看在Qt的mo

2012-10-09 15:41:09 551

转载 Qt学习之路(44): QSortFilterProxyModel

Qt为我们预定义了很多model,前面已经说过了QStringListModel、QDirModel(也算是Qt推荐使用的QFileSystemModel吧,这个在上一章最后重新加上了一段话,没有注意的朋友去看看哦)。今天我们要说的这个QSortFilterProxyModel并不能单独使用,看它的名字就会知道,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它是用来排序和过滤的。

2012-10-08 09:17:04 381

转载 Qt学习之路(43): QDirModel

今天我们来看一个很有用的model:QDirModel。这个model允许我们在view中显示操作系统的目录结构。这次让我们先来看看运行结果:  这个界面很熟悉吧?不过这可不是由QFileDialog打开的哦,这是我们自己实现的。而提供这种实现支持的,就是QDirModel和QTreeView。我们来看一下代码。 mytreeview.h

2012-10-08 00:15:51 390

转载 Qt学习之路(42): QStringListModel

今天开始我们要看看Qt的model-view类了。正如前面说的那样,之前三节的item class类只是Qt为了方便我们使用而封装了的一些操作。比起真正的model-view类来,那些类更易于使用,但是功能也会更简单,并且缺少实时性的支持,比如我们并不方便实现插入、删除等一些常见操作。而现在我们要说的model-view类使用起来可能会复杂一些,但是功能强大,并且在model更新时会自动更新vie

2012-10-08 00:15:27 4515

转载 Qt学习之路(41): QTableWidget

今天的QTableWidget是最后一个items class类型了。不过这并不是model-view的终结,因为我们现在还只是接触到了最简单的model-view的封装类,更复杂和强大的model-view类型的应用还没有见识到呢! QTableWidget用起来也很方便,并不比前面的两个复杂到哪里去。我们运行的结果是这样子的:  下面是代码:

2012-10-08 00:15:04 304

转载 Qt学习之路(40): QTreeWidget

前段时间笔记本坏掉了,一直没有更新博客,现在终于修好了啊,还是来继续《Qt学习之路》这个系列吧! 接着前面的内容,今天要说的是另外一个item view class,QTreeWidget。顾名思义,这个类用来展示树型结构。同前面说的QListWidget类似,这个类需要同另外一个辅助类QTreeWidgetItem一同使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在

2012-10-08 00:14:46 389

转载 Qt学习之路(39): QListWidget

前面一节简单概述著名的MVC模式在Qt中的实现,现在我们从QListWidget开始了解Qt提供的一系列方便的item view类。 第一个要说的是QListWidget。这个类为我们展示一个List列表的视图。下面还是先看代码: listwidget.h#ifndef LISTWIDGET_H #define LISTWIDGET_H  #

2012-10-08 00:14:18 331

转载 Qt学习之路(38): model-view架构

从这一节开始,我们进入model-view阶段。这一阶段主要还是依据 C++ GUI Programming with Qt4, 2nd Edition。 我们的系统有很多数据显示的需求,比如从数据库中把数据取出,然后以自己的方式显示在我们自己的应用程序的界面中。进行这一操作的典型方式是使用Qt的Item View类。 在早期的Qt版本中,要实现这个功能,我们需要定

2012-10-08 00:14:02 351

转载 Qt学习之路(37): Qt容器类之关联存储容器

今天我们来说说Qt容器类中的关联存储容器。所谓关联存储容器,就是容器中存储的一般是二元组,而不是单个的对象。二元组一般表述为,也就是“键-值对”。 首先,我们看看数组的概念。数组可以看成是一种形式的键-值对,它的Key只能是int,而值的类型是Object,也就是任意类型(注意,这里我们只是说数组可以是任意类型,这个Object并不必须是一个对象)。现在我们扩展数组的概念,把Key

2012-10-08 00:13:49 330

转载 Qt学习之路(36): Qt容器类之遍历器和隐式数据共享

前面说过,Qt容器类提供了两种遍历器:Java风格的和STL风格的。前者比较容易使用,后者则可以用在一些通过算法中,功能比较强大。 对于每一个容器类,都有与之相对应的遍历器:只读遍历器和读写遍历器。只读遍历器有QVectorIterator,QLinkedListIterator和QListIterator三种;读写遍历器同样也有三种,只不过名字中具有一个Mutable,即QMut

2012-10-08 00:13:26 532

转载 Qt学习之路(35): Qt容器类之顺序存储容器

本来计划先来说下model/view的,结果发现model/view涉及到一些关于容器的内容,于是就把容器部分提前了。 容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象,这种对象一般是通用的模板类。C++提供了一套完整的解决方案,成为标准模板库Standard Template Library,也就是我们常说的STL

2012-10-08 00:13:04 357

转载 Qt学习之路(34): 国际化(下)

上次说了国际化的过程,现在来看一下具体的国际化的相关代码。 在代码中,我们使用tr()将需要翻译的字符串标记出来。lupdate工具就是提取出tr()函数中的相关字符串。tr()函数是QObject类的一个static函数,其签名如下: static QString tr(const char *sourceText, const char *comment

2012-10-08 00:12:46 316

转载 Qt学习之路(33): 国际化(上)

2D绘图部分基本告一段落,还在想下面的部分要写什么,本来计划先说下view-model的相关问题,但是前面看到有朋友问关于国际化的问题,所以现在先来说说Qt的国际化吧! Qt中的国际化的方法有很多,常用的有使用QTextCodec类和使用tr()函数。前者将编码名称写到代码里面,除非你使用Unicode编码,否则国际化依然是一个问题;后者就不会有这个问题,并且这也是Qt推荐的做法。

2012-10-08 00:12:22 314

转载 Qt学习之路(32): 一个简易画板的实现(Graphics View)

这一次将介绍如何使用Graphics View来实现前面所说的画板。前面说了很多有关Graphics View的好话,但是没有具体的实例很难说究竟好在哪里。现在我们就把前面的内容使用Graphics View重新实现一下,大家可以对比一下看有什么区别。 同前面相似的内容就不再叙述了,我们从上次代码的基础上进行修改,以便符合我们的需要。首先来看MainWindow的代码:

2012-10-08 00:11:59 450

转载 Qt学习之路(31): 一个简易画板的实现(QWidget)

说实话,本来我是没有打算放一个很大的例子的,一则比较复杂,二来或许需要很多次才能说得完。不过,现在已经说完了绘图部分,所以计划还是上一个这样的例子。这里我会只做出一个简单的画板程序,大体上就是能够画直线和矩形吧。这样,我计划分成两种实现,一是使用普通的QWidget作为画板,第二则是使用Graphcis View Framework来实现。因为前面有朋友说不大明白Graphics View的相关内

2012-10-08 00:11:04 772

转载 Qt学习之路(30): Graphics View Framework

现在基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,现在我们就要来看看在绘图部分功能最强大的Graphics View。我们经常说KDE桌面,新版本的KDE桌面就是建立在Graphics View的基础之上,可见其强大之处。 Qt的白皮书里面这样写道:“Qt Graphics View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 w

2012-10-08 00:10:23 290

转载 Qt学习之路(29): 绘图设备

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和QPicture。其中,QPixmap专门为图像在屏幕上的显示做了优化,而QBitmap是QPixmap的一个子类,它的色深限定为1,你可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。QImage专门为图像的像素级访

2012-10-08 00:09:18 394

转载 Qt学习之路(28): 坐标变换

经过前面的章节,我们已经能够画出一些东西来,主要就是使用QPainter的相关函数。今天,我们要看的是QPainter的坐标系统。 同很多坐标系统一样,QPainter的默认坐标的原点(0, 0)位于屏幕的左上角,X轴正方向是水平向右,Y轴正方向是竖直向下。在这个坐标系统中,每个像素占据1 x 1的空间。你可以把它想象成是一张坐标值,其中的每个小格都是1个像素。这么说来,一个像素的

2012-10-08 00:08:57 544

转载 Qt学习之路(27): 渐变填充

前面说了有关反走样的相关知识,下面来说一下渐变。渐变是绘图中很常见的一种功能,简单来说就是可以把几种颜色混合在一起,让它们能够自然地过渡,而不是一下子变成另一种颜色。渐变的算法比较复杂,写得不好的话效率会很低,好在很多绘图系统都内置了渐变的功能,Qt也不例外。渐变一般是用在填充里面的,所以,渐变的设置就是在QBrush里面。Qt提供了三种渐变画刷,分别是线性渐变(QLinearGradie

2012-10-08 00:08:43 763

转载 Qt学习之路(26): 反走样

今天继续前面的内容。既然已经进入2D绘图部分,那么就先继续研究一下有关QPainter的东西吧! 反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。下面我们来看看代码。这段代码仅仅给出了paintEvent函数,相信你可以很轻松地替换掉前面章节中的相关代码。 void P

2012-10-08 00:08:03 913

转载 Qt学习之路(25): QPainter(续)

过去一天没有接上上章的东西,今天继续啊!首先还是要先把上次的代码拿上来。 void PaintedWidget::paintEvent(QPaintEvent *event) {         QPainter painter(this);         painter.drawLine(80, 100, 650, 500);         pai

2012-10-08 00:07:46 283

转载 Qt学习之路(24): QPainter

多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子。因为event比较难做例子,也就没有去写,只是把大概写了一下。今天带来的是新的部分,有关Qt的2D绘图。这部分不像前面的内容,还是比较好理解的啦!所以,例子也会增加出来。 有人问豆子拿Qt做什么,其实,豆子就是在做一个Qt的画图程序,努力朝着Photoshop和GIMP的方向发展。但这终究要经过很长的时间、

2012-10-08 00:07:24 363

转载 Qt学习之路(23): 自定义事件

这部分将作为Qt事件部分的结束。我们在前面已经从大概上了解了Qt的事件机制。下面要说的是如何自定义事件。Qt允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制。那么,为什么我需要使用事件,而不是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的。事件的另外一个好处是,它可以使

2012-10-08 00:06:55 273

转载 Qt学习之路(22): 事件过滤器

Qt创建了QEvent事件对象之后,会调用QObject的event()函数做事件的分发。有时候,你可能需要在调用event()函数之前做一些另外的操作,比如,对话框上某些组件可能并不需要响应回车按下的事件,此时,你就需要重新定义组件的event()函数。如果组件很多,就需要重写很多次event()函数,这显然没有效率。为此,你可以使用一个事件过滤器,来判断是否需要调用event()函数。

2012-10-08 00:06:25 219

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除