正如在上一章讲到的,我们创建了一个叫MyWidget
的项目——现在,如果看一下Qt文档教程的第
一页,你会发现第一个应用程序只包含main()
函数。因此,我们只需要修改项目的main()
函数就可以使教程的第一步运行了。
要访问main()
函数,从“CV”中选择“全局”文件夹,其中又包含了一个“函数”子文件夹,
所有的非类函数都罗列在这里。在右边的“C/C++文件“窗口中会打开main.cpp
,而光标已经
被设置在了main()
的的第一行。
我们可以从现有的代码开始把它改成需要的样子——但是有更容易的办法。用鼠标或按住Shift用下箭头
选择整个main()
。然后再从”编辑“中选择”剪切“或者按DEL键删除所选的代码。在清除整个main
函数后,我们就可以从头开始建立我们的第一个教程。
现在,输入教程中的代码。你可以先仔细地读一遍并试着记住那一行有那些代码。然后,在依次读完教程 的叙述以后,你就可以把它当作例子完成这个教程。
还有更简单的办法:从文档浏览器中选择整个main()
函数并按一下工具条上的”复制“图标。另外,
你也可以使用右键的弹出式菜单或者用”编辑“菜单。这些都会将内容复制到剪贴板中,切换回源代码
窗口以后再选择”粘贴“。(可以用工具条,右键的弹出式菜单或者”编辑“菜单)
最后,在main()
函数外加入相应的头文件:
#include <qapplication.h>
#include <qpushbutton.h>
好了!第一个教程应用的源代码已经准备完毕。
要建立第一个教程,从”建立“菜单中选择“连编”或者按工具条上相应的按钮。另外,你也可以选择 “执行”,它会在建立成功以后执行应用程序。
如果在建立过程中由于错误而停了下来,请相信这是由于你的失误而与教程无关!太打击了吧,我才 刚刚决定写KDE/Qt程序呢!但是,你却可以因此来熟悉使用KDevelop。为了发现错误所在,你有两个 选择:或者点击输出窗口中相应的错误信息,它会把你带到出错所在的行,或者按F4键;另外,你还 可以在“查看”菜单中选择“下一个错误”。
你可能会问“练习?太简单了吧,我不需要做什么练习!”,但是请相信,以后的例子会变得越来越复 杂的。虽然这个程序是最简单的例子,但是它们越复杂你就需要花费越多的精力去思考才能搞懂这些教 程中的代码。而且做一做练习也可以使你学会如何在实践中使用KDevelop和它的各项特征。
为了在第一个教程中学到更多的知识,你应该试着按照下面所述的提示改变代码,然后看一看这些变化 是如何影响程序行为的:
setText()
代替在构造函数中直接为按钮设置文本QPushButton::resize ( const QSize & s )
代替
直接设置宽和高。创建一个QSize
的实例,其中包含size
教程的第二步和第三步是第一步的展开,你可以从中学到signal和slot以及在widget间的父子关系。
为什么要学这些呢?signal和slot是Qt库和其它widget库之间最大的区别。当你涉及到需要实现在各个 对象之间通信时,它会显著地缩短工作时间。如果发生了错误是不会导致严重后果的,即使错误的连接 也不会导致“segmentation fault”这样的错误。这就是Qt的力量,而正因为其灵活性,许多的KDE/Qt 开发者都不想失去它。因此,明白signal/slot机制是创建任何KDE/Qt程序的要点。
另一件需要注意的事是,按钮调用quit()
来结束QApplication
实例。你在使用QApplication
的KDE装饰物或KApplication
时会再次遇到quit()
在成功的更改并拓展main()
函数后,你将生成一个新的widget——一个唯一的你在第四步中可以
创建的wideget。事实上,这个类已经由应用程序向导生成了,所以并不需要添加很多的代码——你只
需要把在第四课main.cpp
文件中的代码插入到MyWidget
类的头文件和实现文件就可以了。
幸运的是,实际上你只用把实现部分添加到构造函数中。
从类视图中选择要访问的构造函数。这会自动把你带到需要添加代码的实现部分。
要注意包括 第五课的目标是扩展widget类。因而,你会学到有关虚拟函数的知识。在这里 无论何时写自己的widget,特别是应用程序的可视区域,你都得自己重写那些需要处理的widget事件方
法,以替代缺省的实现。例如:
然后你就可以处理事件参数了。对
在第六课里,你需要为教程程序添加一个新类。一般你可能会想“我只需要创建一个头文件和一个实现
文件就可以了”——但是KDevelop使你做起来更轻松。当添加一个类时,你应该总使用类生成器。它会
为你做所有的工作而你只需要添加必需的代码。
要使用类生成器添加类,选择“项目”——“新建类”,在打开的对话框中输入你需要的值。首先要输
入类名。教程用 因为文件名是自动输入的,你不必去管它。唯一需要提醒的是添加文档。为类添加描述性的文档总是一
个好的风格,特别是类名
在教程的剩余各步中,你会学到所有必需的知识——添加所需的类并做各种改动。
在每一次更改后,你都应该重新建立并检查错误。运行一下应用程序,看看它是如何执行的;另外,你应
该玩一玩KDevelop“建立”的参数—运行应用程序时加上命令行参数如—geometry,用工具窗口中的KDbg
进行调试。然后你就能够进行Qt例子,它们在下一章中讨论。
qfont.h>——
QFont
只用在MyWidget
的构造函数中。因此,在mywidget.cpp>
的顶部添加
#include <qfont.h>
要运行程序,只要按一下“执行”就可以了。它会在自动保存后编译更改后的代码。
3.4 扩展Widget类
resizeEvent()
被重
写。另一个需要重点学习的是(除了如何扩展类)Qt使用虚函数来处理用户事件,而把事件本身作为
参数。因此,你必须熟悉以下的Qt类:
virtual void mousePressEvent ( QMouseEvent *)
处理鼠标事件。在实现时,你必须在函数头中
输入一个参数名,大多数程序员用event
或者干脆用e
作为参数名。
QMouseEvent
而言,你可以知道引发该事件的按钮是左键,中键
或者右键。
3.5 添加新类
LCDRange
,所以首先输入这个名字。然后是基类。基类就是新类所要继承的类。
看一下教程(Qt 1.42),这是QWidget
。由于大部分的GUI类都是从QWidget继承,类生成器简化
了这个步奏。不输入基类类名而在“附加选项”部分选上“QWidget的子类”这会自动在头文件中加入Q_OBJECT
宏,使用slot和signal必需此宏。(见在第七章)
LCDRange
并不告诉你该widget的用途。
3.6 第七到十四步