The K Desktop Environment

下一页 上一页 内容

3. 建立Qt教程

3.1 第一步:Hello World!

正如在上一章讲到的,我们创建了一个叫MyWidget的项目——现在,如果看一下Qt文档教程的第 一页,你会发现第一个应用程序只包含main()函数。因此,我们只需要修改项目的main() 函数就可以使教程的第一步运行了。

要访问main()函数,从“CV”中选择“全局”文件夹,其中又包含了一个“函数”子文件夹, 所有的非类函数都罗列在这里。在右边的“C/C++文件“窗口中会打开main.cpp,而光标已经 被设置在了main()的的第一行。

首先改什么

我们可以从现有的代码开始把它改成需要的样子——但是有更容易的办法。用鼠标或按住Shift用下箭头 选择整个main()。然后再从”编辑“中选择”剪切“或者按DEL键删除所选的代码。在清除整个main 函数后,我们就可以从头开始建立我们的第一个教程。

输入教程代码

现在,输入教程中的代码。你可以先仔细地读一遍并试着记住那一行有那些代码。然后,在依次读完教程 的叙述以后,你就可以把它当作例子完成这个教程。

还有更简单的办法:从文档浏览器中选择整个main()函数并按一下工具条上的”复制“图标。另外, 你也可以使用右键的弹出式菜单或者用”编辑“菜单。这些都会将内容复制到剪贴板中,切换回源代码 窗口以后再选择”粘贴“。(可以用工具条,右键的弹出式菜单或者”编辑“菜单)

最后,在main()函数外加入相应的头文件:

#include <qapplication.h>
#include <qpushbutton.h>

好了!第一个教程应用的源代码已经准备完毕。

建立Hello World!

要建立第一个教程,从”建立“菜单中选择“连编”或者按工具条上相应的按钮。另外,你也可以选择 “执行”,它会在建立成功以后执行应用程序。

如果在建立过程中由于错误而停了下来,请相信这是由于你的失误而与教程无关!太打击了吧,我才 刚刚决定写KDE/Qt程序呢!但是,你却可以因此来熟悉使用KDevelop。为了发现错误所在,你有两个 选择:或者点击输出窗口中相应的错误信息,它会把你带到出错所在的行,或者按F4键;另外,你还 可以在“查看”菜单中选择“下一个错误”。

练习

你可能会问“练习?太简单了吧,我不需要做什么练习!”,但是请相信,以后的例子会变得越来越复 杂的。虽然这个程序是最简单的例子,但是它们越复杂你就需要花费越多的精力去思考才能搞懂这些教 程中的代码。而且做一做练习也可以使你学会如何在实践中使用KDevelop和它的各项特征。

为了在第一个教程中学到更多的知识,你应该试着按照下面所述的提示改变代码,然后看一看这些变化 是如何影响程序行为的:

  1. 把按钮变成QLabel
  2. setText()代替在构造函数中直接为按钮设置文本
  3. QPushButton::resize ( const QSize & s )代替 直接设置宽和高。创建一个QSize的实例,其中包含size
  4. 改变这些大小,看一看哪个是宽,哪个是高

3.2 第二步和第三步:拓展

教程的第二步和第三步是第一步的展开,你可以从中学到signal和slot以及在widget间的父子关系。

为什么要学这些呢?signal和slot是Qt库和其它widget库之间最大的区别。当你涉及到需要实现在各个 对象之间通信时,它会显著地缩短工作时间。如果发生了错误是不会导致严重后果的,即使错误的连接 也不会导致“segmentation fault”这样的错误。这就是Qt的力量,而正因为其灵活性,许多的KDE/Qt 开发者都不想失去它。因此,明白signal/slot机制是创建任何KDE/Qt程序的要点。

另一件需要注意的事是,按钮调用quit()来结束QApplication实例。你在使用QApplication 的KDE装饰物或KApplication时会再次遇到quit()

3.3 编写你自己的Widget

在成功的更改并拓展main()函数后,你将生成一个新的widget——一个唯一的你在第四步中可以 创建的wideget。事实上,这个类已经由应用程序向导生成了,所以并不需要添加很多的代码——你只 需要把在第四课main.cpp文件中的代码插入到MyWidget类的头文件和实现文件就可以了。 幸运的是,实际上你只用把实现部分添加到构造函数中。

从类视图中选择要访问的构造函数。这会自动把你带到需要添加代码的实现部分。

要注意包括qfont.h>——QFont只用在MyWidget的构造函数中。因此,在mywidget.cpp> 的顶部添加#include <qfont.h> 要运行程序,只要按一下“执行”就可以了。它会在自动保存后编译更改后的代码。

3.4 扩展Widget类

第五课的目标是扩展widget类。因而,你会学到有关虚拟函数的知识。在这里resizeEvent()被重 写。另一个需要重点学习的是(除了如何扩展类)Qt使用虚函数来处理用户事件,而把事件本身作为 参数。因此,你必须熟悉以下的Qt类:

  • QEvent
  • QChildEvent
  • QCloseEvent
  • QFocusEvent
  • QKeyEvent
  • QMouseEvent
  • QMoveEvent
  • QPaintEvent
  • QResizeEvent
  • QTimerEvent

无论何时写自己的widget,特别是应用程序的可视区域,你都得自己重写那些需要处理的widget事件方 法,以替代缺省的实现。例如:

virtual void mousePressEvent ( QMouseEvent *)处理鼠标事件。在实现时,你必须在函数头中 输入一个参数名,大多数程序员用event或者干脆用e作为参数名。

然后你就可以处理事件参数了。对QMouseEvent而言,你可以知道引发该事件的按钮是左键,中键 或者右键。

3.5 添加新类

在第六课里,你需要为教程程序添加一个新类。一般你可能会想“我只需要创建一个头文件和一个实现 文件就可以了”——但是KDevelop使你做起来更轻松。当添加一个类时,你应该总使用类生成器。它会 为你做所有的工作而你只需要添加必需的代码。

要使用类生成器添加类,选择“项目”——“新建类”,在打开的对话框中输入你需要的值。首先要输 入类名。教程用LCDRange,所以首先输入这个名字。然后是基类。基类就是新类所要继承的类。 看一下教程(Qt 1.42),这是QWidget。由于大部分的GUI类都是从QWidget继承,类生成器简化 了这个步奏。不输入基类类名而在“附加选项”部分选上“QWidget的子类”这会自动在头文件中加入Q_OBJECT宏,使用slot和signal必需此宏。(见在第七章)

因为文件名是自动输入的,你不必去管它。唯一需要提醒的是添加文档。为类添加描述性的文档总是一 个好的风格,特别是类名LCDRange并不告诉你该widget的用途。

3.6 第七到十四步

在教程的剩余各步中,你会学到所有必需的知识——添加所需的类并做各种改动。

在每一次更改后,你都应该重新建立并检查错误。运行一下应用程序,看看它是如何执行的;另外,你应 该玩一玩KDevelop“建立”的参数—运行应用程序时加上命令行参数如—geometry,用工具窗口中的KDbg 进行调试。然后你就能够进行Qt例子,它们在下一章中讨论。

下一页 上一页 内容