Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308863
  • 博文数量: 59
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-21 09:31
文章分类

全部博文(59)

文章存档

2011年(1)

2009年(58)

我的朋友

分类: C/C++

2009-11-07 11:20:32

Qt 深入浅出

经常有人问哪里有学习Qt的资料,Qt的教程,怎么才能入门等等,或者抱怨说中文的信息太少。其实网上有很多关于Qt的学习资料,今天在这里总结一下,希望各位想学习Qt的同学,各取所需,早日从入门到精通!

Part 1: 新手上路

Qt 官方学习教程

Qt 官方学习教程包含了3部分,包括如何学习Qt,如何逐步创建一个地址簿应用以及如何编写Qt Widget。教程由浅入深,Qt初学者必读
我们假定您已了解 C++, 并将用于 Qt 开发。有关将 Qt 与其他编程语言一起使用的更多信息,请参见 。。。。。
本教程介绍了使用 Qt 跨平台框架的 GUI 编程。在学习过程中,我们将了解部分 Qt 基本技术,如Widget 和布局管理器,容器类,信号和槽,输入和输出设备等。。
Widget 是使用 Qt 编写的图形用户界面 (GUI) 应用程序的基本生成块。每个 GUI 组件,如按钮、标签或文本编辑器,都是一个 widget ,并可以放置在现有的用户界面中或作为单独的窗口显示。每种类型的组件都是由 的特殊子类提供的,而 QWidget 自身又是 的子类。

Qt 学习之路:

来自于FinderCheng的Qt 学习之路。简介:在本系列文章中,FinderCheng使用Qt4进行C++ GUI的开发。我是参照着《C++ GUI Programming with Qt4》一书进行学习的。其实,我也只是初学Qt4,在这里将这个学习笔记记下来,希望能够方便更多的朋友学习Qt4。我是一个Java程序员,感觉 Qt4的一些命名规范以及约束同Java有异曲同工之妙,因而从Java迁移到Qt4似乎困难不大。不过,这也主要是因为Qt4良好的设计等等。
Qt是一个著名的C++库——或许并不能说这只是一个GUI库,因为Qt十分庞大,并不仅仅是GUI。使用Qt,在一定程序上你获得的是一个“一 站式”的服务:不再需要研究STL,不再需要C++的 ,因为Qt有它自己的QString等等。或许这样说很偏激,但Qt确实是一个 “伟大的C++库”。
任何编程技术的学习第一课基本上都会是Hello, world!,我也不想故意打破这个惯例——照理说,应该首先回顾一下Qt的历史,不过即使不说这些也并无大碍。
下面来逐行解释一下前面的那个Hello, world!程序,尽管很简单,但却可以对Qt程序的结构有一个清楚的认识。现在再把代码贴过来:
所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座。怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这 个组件就 会发出一个信号。就像是广播一样,如果有了事件,它就漫天发声。这时,如果有一个槽,正好对应上这个信号,那么,这个槽的函数就会执行,也就是回调。就像 广播发出了,如果你感兴趣,那么你就会对这个广播有反应。干巴巴的解释很无力,还是看代码:
顾名思义,绝对定位就是使用最原始的定位方法,给出这个组件的坐标和长宽值。这样,Qt就知道该把组件放在哪里,以及怎么设置组件的大小了。但是 这样做的 一个问题是,如果用户改变了窗口大小,比如点击了最大化或者拖动窗口边缘,这时,你就要自己编写相应的函数来响应这些变化,以避免那些组件还只是静静地呆 在一个角落。或者,更简单的方法是直接禁止用户改变大小。
今天来说一下有关Qt API文档的使用。因为Qt有一个商业版本,因此它的文档十分健全,而且编写良好。对于开发者来说,查看文档时开发必修课之一——没有人能够记住那么多API的使用!
首先说明一点,在C++ GUI Programming with Qt4, 2nd中,这一章连同以后的若干章一起,完成了一个比较完整的程序——一个模仿Excel的电子表格。不过这个程序挺大的,而且书中也没有给出完整的源代 码,只是分段分段的——我不喜欢这个样子,我想要看到我写出来的是什么东西,这是最主要的,而不是慢慢的过上几章的内容才能看到自己的作品。
Qt是分模块的,记得我们建工程的时候就会问你,使用哪些模块?QtCore?QtGui?QtXml?等等。这里,我们引入QtGui,它包括 了 QtCore和QtGui模块。不过,这并不是最好的做法,因为QtGui文件很大,包括了GUI的所有组件,但是很多组件我们根本是用不到的——就像 Swing的import,
函数和 普通的C++成员函数没有很大的区别。它们也可以使virtual的;可以被重写;可以使public、protected或者private 的;可以由其它的C++函数调用;参数可以是任何类型的。如果要说区别,就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用。
前面说过,Qt使用的是自己的预编译器,它提供了对C++的一种扩展。利用Qt的信号槽机制,就可以把彼此独立的模块相互连接起来,不需要实现知道模块的任何细节。为了达到这个目的,Qt提出了一个Meta-Object系统。它提供了两个关键的作用:信号槽和内省。
尽管Qt提供了很方便的快速开发工具QtDesigner用来拖放界面元素,但是现在我并不打算去介绍这个工具,原因之一在于我们的学习大体上是依靠手工编写代码,过早的接触设计工具并不能让我们对Qt的概念突飞猛进
在前面的QMainWindow的基础之上,我们开始着手建造我们的应用程序。虽然现在已经有一个框架,但是,确切地说我们还一行代码没有写呢!下面的工作就不那么简单了!在这一节里面,我们要为我们的框架添加菜单和工具条。
前面一节我们已经把QAction添加到菜单和工具条上面。现在我们要添加一些图片美化一下,然后把信号槽加上,这样,我们的action就可以相应啦!
今天的内容主要还是继续完善前面的那个程序。我们要为我们的程序加上一个状态栏。
下面还是按照我们的进度,从Qt的标准对话框开始说起。所谓标准对话框,其实就是Qt内置的一些对话框,比如文件选择、颜色选择等等。今天首先介绍一下QFileDialog。
继续来说Qt的标准对话框,这次说说QColorDialog。这是Qt提供的颜色选择对话框。
程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数。这个参数通常是QObject* 或者是 QWidget* 类型的。
这次来说一下QMessageBox以及类似的几种对话框。其实,我们已经用过QMessageBox了,就在之前的几个程序中。
这是Qt标准对话框的最后一部分。正如同其名字显示的一样,QInputDialog用于接收用户的输入。

Part 2: 进阶学习

Qt4 学习笔记

来自台湾的caterpillar,Qt4 学习笔记由浅入深,分门别类的介绍了Qt4 中的许多特性,如事件處理,常用圖型元件,常用 API,檔案處理,拖放(Drag & Drop)與剪貼,多執行緒(Multithreading)很多内容,是进一步学习Qt的极好教程

Qt 开发实例

这里我们将会构建所能想到的最简单和最直观的音乐播放器,给用户提供另一个选择。 从苹果的新款iPod Shuffle吸取一些灵感,只提供最基本的控制功能。
如果说有一种工具非常需要GUI,那就是FFMPEG。FFMPEG是一个十分优秀的命令行应用程序,它可以将视频和电影文件从一种格式转换为另一种格式。
这个应用程序就是一个RSS阅读器,它允许用户添加自己的种子,列出该种子上的内容,然后让用户在主应用程序自带的一个浏览器窗口中阅读这些内容。

Qt Graphics View详解

来自清源游民的Qt笔记,详解介绍了Qt Graphics View中各个对象的概念和使用方法。对于Graphics View的学习大有裨益。
Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。
Graphics View基于笛卡尔坐标系。item在场景中的位置与几何形状通过x,y坐标表示。当使用未经变形的视图来观察场景时,场景中的一个单位等于屏幕上的一个像素。
QGraphicsView通过QGraphicsView::setMatrix()支持同QPainter一样的仿射变换,通过对一个视图应用变换,你可以很容易地支持普通的导航特性如缩放与旋转。

关于Qt编程的书籍

接下来当你学习了上面的相关内容后,就可以开始阅读Qt编程的书籍进行系统的学习了。当然,书也不一定要从头到尾阅读一遍,用时拿出来学习和参考也很不错

本书详细讲述了用最新的Qt版本进行图形用户界面应用程序开发的各个方面。前5章主要涉及Qt基础知识,后两个部分主要讲解Qt的中高级编程,包括 布局管 理、事件处理、二维/三维图形、拖放、项视图类、容器类、输入/输出、数据库、多线程、网络、XML、国际化、嵌入式编程等内容。对于本书讲授的大量 Qt4编程原理和实践,都可以轻易将其应用于Qt4.4、Qt4.5以及后续版本的Qt程序开发过程中。

Part3:深入理解

Inside Qt 系列

QKevin所著,通过剖析Qt源代码,深入浅出的解释了Qt中的许多机制,了解Qt内部是如何 work 的。着实为想深入了解Qt的开发者提供了很好的学习机会。如果你已经学习了上面的内容并且熟练掌握Qt编程,那么大力推荐这一系列文章!
写了这么多年的程序,除了留下很多 code (其中有很多是garbage)之外,再没有其它东西,或许我该写点儿什么了,写一些关于我的工作的东西,自己所了解的技术,也把自己在工作过程中新学习的一些东西放在这儿,就算是为了以后做一个参考。
QObject 这个 class 是 QT 对象模型的核心,绝大部分的 QT 类都是从这个类继承而来。这个模型的中心特征就是一个叫做信号和槽(signal and slot)的机制来实现对象间的通讯,
我们知道,在C++中,几乎每一个类(class)中都需要有一些类的成员变量(class member variable),在通常情况下的做法如下:
在 QT 4.4 中,类成员变量定义方法的出发点没有变化,只是在具体的实现手段上发生了非常大的变化,下面具体来看。
接上节,让我们来看看这个 QObjectPrivate 和 QObject 是如何关联在一起的。
从本节开始,我们讲解 QT Meta-Object System 的功能,以及实现。在使用 Qt 开发的过程中,大量的使用了 signal 和 slot. 比如,响应一个 button 的 click 事件,我们一般都写如下的代码:
元对象编译器用来处理QT 的C++扩展,moc 分析C++源文件,如果它发现在一个头文件(header file)中包含Q_OBJECT 宏定义,然后动态的生成另外一个C++源文件
信号和 槽是用来在对象间通讯的方法,当一个特定事件发生的时候,signal会被 emit 出来,slot 调用是用来响应相应的 signal 的。
前面我们介绍了 Meta Object 的基本功能,和它支持的最重要的特性之一:Signal & Slot的基本功能。现在让我们来进入 Meta Object 的内部,看看它是如何支持这些能力的。
我们来看一下QMetaObject的定义,我们先看一下QMetaObject对象中包含的成员数据。
我们都知道,把一个signal和slot连接起来,需要使用QObject类的connect方法,它的作用就是把一个object的signal和另外一个object的slot连接起来,以达到对象间通讯的目的。
当我们写下一下emit signal代码的时候,与这个signal相连接的slot就会被调用,那么这个调用是如何发生的呢?让我们来逐一解开其中的谜团。
很多C/C++初学者常犯的一个错误就是,使用malloc、new分配了一块内存却忘记释放,导致内存泄漏。Qt的对象模型提供了一种Qt对象之间的父 子关系..
首先,让我们来看看Qt/e的系统结构介绍:Qt for destop Linux 和 Qt for Embedded Linux 最大的区别就在于他们所依赖的底层显示基础的不同,这也就导致了他们在体系结构上的差异。
本输入法设计指南针对Qt for Embedded Linux 4.5.1,并且以中文输入法为例做说明,并且本文只是侧重于说明Qt/Embedded对输入法的支持接口,
前面我们介绍了Qte输入法的基本设计思路,以及一个最简单的例子,那么,Qte的输入法是如何工作的呢?本节我们就来看一下Qte的源代码,一起来解开这个谜团。

Part 4:移动平台开发

Symbian S60

Forum Nokia Qt for Mobile Developers training
09年10月21至23号,某人参加了诺基亚在北航举办的Qt开发培训。培训师是来自于芬兰的Niemi Petri,英语比好多芬兰人要好,课程讲得深入浅出,很好理解。课程内容涉及Qt的基本知识,以及Qt在S60和Maemo上的开发。下面是培训的PPT和作业以及演示代码。
第一天培训ppt:
第二天培训ppt:
第三天培训ppt:
第一天练习:
第二天演示:

Maemo

© 特别感谢Q-Kevin,FinderCheng,caterpillar的原创文章,所有文章都已注明出处。
阅读(3370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~