Qt学习方法(丁林松总结)

趁着有机会歇一歇关于Qt 的学习方法。 Qt 本来是在Linux 操作系统上开发出来的一种图形界
面的解决方案, 当初只是在linux 上面运行, 它的底层库是依赖XLib 这个库的支持, 所以在了解Qt之前最好是了解一下XWindow 的运行原理, 所以看到我这篇文章的学生应该注意听讲关于XWindow的运作机制, 由于我们是学习嵌入式的, 所以对于嵌入式的Framebuffer 与XWindow 做一个很好的对比, 对于我们学习起来会更顺利, 当然这些都是在后期移植的时候需要掌握的。 Qt 发展的确很快, 在三年前还没有这样好的集成开发工具 ,也就是IDE 环境。 当用设计器 Qt Designer 设计好一个界面后, 他是独立的, 需要使用uic 单独编译成为一个C++ 的头文件的代码, 其中包含了许多声明跟实例化, 现在看上去所有的细节已经被封装起来了, 当然你不需要了解这么多的东西, 只需要完成框架的设计。 谁也没有要求你掌握Qt 去开发内核级的应用程序。 总体看来开发Qt 程序要掌握框架, 内容很多, 这不必担心, 因为只要有框架, 我们总会有办法找到实现的方法, 教学过程当中应该我试图让学生掌握到框架的思维, 然后在框架搭建起来之后, 去完成一些细节的功能, 一个项目, 可能牵扯到很多, 只要还是分类。 这里的分类很有意思, 你比如说, QString 这个类是经常使用的, 你可以考虑一下, QString 可以转换成为其他的类型, 可以使用静态声明的方法来使用, QString 作为一个对象应该是被深入到人的心里当中。 说到这么多内容, 我们要有一个方法去总结, 例如当使用一个标签的时候, 英文单词是Label , 我们所要做的是就是在前面加一个Q ,即QLabel 这就是我们想找到的类, 其他的就很简单了例如文件对话框 FileDialog 他是一个合成词, 每个头字母大写, 这是驼峰命名法的特点, 一样的前面加一个Q ,QFileDialog 就是文件对话框的类, 再举几个例子, QColorDialog QFontDialog , 套接字 QTcpSocket , QUdpSocket 如果你英文还不算差的话, 应该知道这些类是干什么用的了。 方法是最重要的, 有时候我们区分不了一些方法的原因是, Qt 中引入了槽的概念, 你会发现槽也是一种函数, 按照方法的方式来调用。帮助文档中很明确, 你需要了解到你什么时候使用方法, 什么时候使用信号与槽. 这些事情都是约定俗成的, 当你相应某个事情的时候, 注意听, 当要响应某个事情的时候, 就需要信号跟槽。 当然信号跟槽可能是有限的, 你需要自定义的信号跟槽来完成你需要的操作。 如果功能还没有达到需求, 或者说, 还需要一些系统特殊的方法, 那就需要考虑到事件了。 大概有些了解了, 之后是说信号跟槽。 我们可以用下面的方法来了解信号跟槽。 if(某个信号发出了) 就需要执行某个链接的槽 也可以说成 if(需要执行这个槽的时候) 信号必须发出 只有信号发出了, 才可以出发某个槽。 信号可能是系统定义的, 也可能是你自己写的, 槽也一样。 这就出现了系统信号、槽, 与自定义信号槽。 我想在上课的时候讲几种方法的时候就可以表现出来了。 认真听听就会了, 后期需要大量的信号跟槽的连接, 是通过一个项目完成的, 其中这个项目的目的就是让你了解信号跟槽的概念, 模块开发, 了解 接口跟实现的有点, 了解怎样扩展开发, 多窗口, 美工, 软件图标, 发布软件, 跟逆向工程。 看上去很多的样子, 这都是建设框架, 其中每一个部分深入研究都有很路要走。 但是如果你一旦入门, 开发起来会变得很容易, 而且绕有兴趣。 Qt 的开发比较头疼的就是如何去查找海量的文档, 怎样能够从这么多的文档中定位自己要找的东西, 并且这些东西还真的是你需要的。 文档是开发中必不可少的, 即使是最懂得Qt 的程序员也需要查看文档, 没有人去背诵那么多的属性跟方法, 包括长篇大论的枚举类型, 跟全局宏, 全局宏函数。 所以我们掌握的不是背诵所有方法, 而是查找的方法, 当你知道你现在需要一个什么样的类的时候, 你就可以在index 中输入你所需要的索引, 查找到相关的类, 在编程的过程中, 为了更能体现Qt 的快速开发跟C++ 的面向对象的特性, 建议还是使用方法的方式给对象设置属性, 而抛弃构造方法为对象赋值属性。 所以每个方法都有自己的意义跟特征, 最主要的你需要掌握每个方法的参数跟返回值, 有时候引用的参数会造成一些不必要的误会, 但是你可以多尝试。 例如QString 中有一些转换的方法: toInt , toFloat , tolong 顾名思义就是转换成为数字来参与运算。 另外一种就是set开头的方法, 他们往往是设置一些属性, 这些属性还可以逆向操作, 所谓逆向操作就是设置属性跟获得属性, 有些方法则是一个单词, 所以还是需要掌握一些英文吧。 谈到了方法, 每个方法也有自己的属性,C++ 中的 public protected private . public 往往要求继承类能够继承的属性, 也就是在子类中要求能够使用的, protected 大部分Qt 中是使用的事件或者是虚函数, 完成事件的多样性, 例如 closeEvent() ,mouseEvent() . 还有就是虚函数,比如说QThread::run() 方法, 你需要在run 中写入你想执行的操作, 才能构造出一个能够执行的线程。 这些分类比较明显, 每个reference 帮助文档的开头都有目录索引, 你要找的话直接点击链接就可以, 跳转到你要找的内容, 这就缩小了查找的范围。还有一种是static方法, 在学习C++ 的时候都知道静态方法有个好处就是对象不用实例化就可以使用的方法。 当然实例化的对象也能使用静态方法,这里不做讨论, 大部分的一些功能的实现Qt 似乎都做成了静态方法, 举出几个例子: QFileDialog::getSaveFileName() QMessageBox::information , QMessageBox::warning() 还有QFontDialog::getFont() 颜色啊, 输入文本框啊, 还有打印机什么的, 都是使用这种静态方法, 知道了这些静态方法后你就需要总结一下了, 这是作为方法的记忆。 还有一个无从下手的就是, 当需要一个方法的时候, 你感觉上应该有这个方法, 但是在当下这个类中查不到, 不要紧你需要进入它的父类, 如果还找不到, 那就如他的爷爷类_ 。 其实还有一个方法, 就是点击 list all property and method 这个链接, 一般都在文档的最前面, 就可以找到所需要的方法了。 找文档如果找不到的话千万别说自己的人品问题, 要想办法从经验中获取方法。 话说了这么多, 如果你不坚持键入代码的话也是徒劳的。 因为代码才能让你有更好的组织方法, 更好的反应能力, 跟更好的融入Qt 这个框架当中。 还有一件事情就是可以加快你打代码的速度, 以前在中石化工作的时候, 憋了很长时间, 突然早晨坐地铁灵感到来, 在计算机面前半个小时打了1000多行代码, 问题解决了。 所以更多的代码量能提高人的速度, 而且如果你代码量增加起来的时候, 你会认为Qt 就是一种工具, 挥洒才情的工具。 uic moc跟rcc 这个在课堂上看看演示就可以了, 这几个编译器为我们做了很多。 让我们节省了大量的功夫。 模块开发是很重要的, 大部分的图形程序是通过GUI 模块开发的, 当然必须用到Core模块例如QApplication 虽然是使用在图形界面上, 但是他是从QCoreApplication 继承而来的, 而QCoreApplication 则是Core模块的, 你会发现当你建立一个工程的时候会自动的添加两个模块。 另外我们Qt 中还会学到 network , sql , webkit , 与phonon模块。 这种分模块没什么难度, 就是跟使用Qt 常用部件一样, 只不过在工程文件中加入了模块名称而已。 有时候你希望你的程序十分漂亮, 也就是在美工方面做到很好, 可能会使用QML语言, 这时候你必须加入declarative模块, 这部分模块我也在摸索当中, 最主要的是QML 元素的理解, 翻译了部分内容, 如果大家有兴趣可以给我索取。    还有一个问题在一些内训的时候有人经常问到, Qt3 跟Qt4 有什么区别。 区别可大了,  例如Qt3 中头文件是这样的 qappliation.h , 4 中是这样的, 这是一种不同, Qt3 中所支持的部件比较古朴, 说的好听叫古朴, 不好听叫难看。 但是Qt3中似乎有很多比较好的功能的支持 例如 pop3 邮件服务, 到了Qt4 中就没有了。 Qt3的QTableView 做的比较好一些, 有直接的ui 方法, Qt 是提供了QTableWidget 作为QTableView 的子类来使用, 增加了ui 编辑的功能, 总体说来, Qt4 比Qt 3 有很多的进步, 虽然在第四版本中提供了向下兼容的模块, 但是还是希望大吉采取 4 版本来开发, 3版本太折磨人了, 3 没有集成开发环境, 4 有比较好的继承开发环境, 如果你愿意还可以把交叉编译工具链加入进来。 移植过程 在一直过程中, s3c 2410 开发板大部分是移植的Qtopia 4.3 也就是Qt 的 4.x 的嵌入式版本, 一直到诺基亚收购了Trolltech 后Qtopia 已经放弃更新了, 虽然现在很多设备还在用这种版本。 汇文使用的s3c2440 所以我们可以成功的一直 Qt/E 4.6.3 请对比着两种版本的不同。 Qtopia 没有QSound 的类的支持, 所以提供音频发声的话肯定会出问题。 另外他们都是基于Framebuffer 架构的, 所以移植 mplayer 会占据全屏, 目前还没有好的解决办法。 只能在部件上加入一个比较大的button, 来停止播放, 4.6.3 中包含了部分phonon模块,但是内容不是很全面。 如果有更多需要你可以尝试 6440 开发板, ARM11 能够将Qt/E 4.7.x版本移植过去, 基本上所有的模块你能想象到的都可以支持了。 移植过程是一个漫长的过程, 如果你的机器很好还不错, 不好, 那需要等上一个上午或者一天, 来等待编译完成, 中间可能会出错, 大家不要灰心认真找到错误的原因, 修改掉就没问题了 。 针对大家所说的内容, 我做了一个方法论的总结, 如果有其他的问题, 我还会写一些文章来说明 。希望对大家有用。

你可能感兴趣的:(QT学习,qt)