KDE应用程序教程: 建立Qt教程

下一页 上一页 内容

### 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例子，它们在下一章中讨论。

下一页 上一页 内容