17.6 KDE的菜单和工具栏

为了展示KDE构件的强大功能,我们把菜单和工具栏留到最后来讲,因为它们非常好地说明了,相比使用Qt或其他图形用户界面工具包,KDE库是如何节省时间和精力的。

通常在GUI库中,菜单项和工具栏项是不同的元素,它们各有各的构件。你必须分别针对它们创建对象并跟踪其变化,例如单独禁用某一项。

KDE程序员提出了一个更好的解决方案。与使用分开解决的方法不同,KDE定义了一个KAction构件来代表应用程序可以执行的动作。这个动作可以是打开新文档、保存文件或显示帮助窗口等。

创建KAction时,向它传递一个文本、快捷键、图标和槽(KAction被激活时调用):

17.6 KDE的菜单和工具栏 - 图1

然后,KAction可以在不加任何其他描述的情况下插入到菜单和工具栏中:

17.6 KDE的菜单和工具栏 - 图2

这样你就创建了一个New菜单和工具栏项。在它被点击时,将调用newFile。

如果你想禁用KAction,比如说你不想让用户创建新文件,只需下面一行代码:

17.6 KDE的菜单和工具栏 - 图3

这就是KDE菜单和工具栏的所有内容,的确很简单。下面看一下KAction的构造函数:

17.6 KDE的菜单和工具栏 - 图4

KDE提供了标准的KAction对象,这确保了文本、图标和快捷键在所有KDE应用程序中都是一样的:

17.6 KDE的菜单和工具栏 - 图5

每个标准动作都使用相同的参数:槽接收者和槽函数,一个KActionCollection对象和KAction名字。KActionCollection对象管理窗口中的KAction,你可以通过调用KMainWindow的actionCollection方法来得到当前对象:

17.6 KDE的菜单和工具栏 - 图6

实 验 一个带有菜单和工具栏的KDE应用程序

你将在下面这个例子中尝试在KDE应用程序中使用KAction。

(1)首先,从头文件KDEMenu.h开始。KDEMenu是KMainWindow的子类,KMainWindow本身又是QMainWindow的子类。KMainWindow在KDE中处理会话管理,它集成了工具栏和状态栏。

17.6 KDE的菜单和工具栏 - 图7

17.6 KDE的菜单和工具栏 - 图8

(2)在KDEMenu.cpp中,第一行的#include语句用于包括你将使用的构件声明:

17.6 KDE的菜单和工具栏 - 图9

(3)在构造函数中,你创建了3个KAction构件。new_file以手工定义的方式创建,quit_action和help_action使用标准的KAction定义:

17.6 KDE的菜单和工具栏 - 图10

(4)创建两个顶层菜单,并把它们插入到KApplication菜单栏中:

17.6 KDE的菜单和工具栏 - 图11

(5)现在,在菜单和工具栏中插入动作,并在new_file和quit_action之间插入一个分隔线:

17.6 KDE的菜单和工具栏 - 图12

(6)最后是一些槽定义:aboutApp创建一个KAbout对话框来显示程序相关信息。注意,quit槽是作为KApplication的一部分来定义的:

17.6 KDE的菜单和工具栏 - 图13

17.6 KDE的菜单和工具栏 - 图14

(7)接下来,你需要为qmake创建一个menu.pro文件:

17.6 KDE的菜单和工具栏 - 图15

(8)运行qmake来创建Makefile,然后编译和运行。

17.6 KDE的菜单和工具栏 - 图16

实验解析

虽然这个例子看上去比其他例子要长,但其创建菜单栏和菜单的代码还是相对比较简洁的。KAction构件的好处是:你可以在多个地方使用它,如在工具栏中和在菜单栏上的菜单中,这些都在这个例子中有所表现。

编译KDE应用程序所需的工作量比编译其他大多数程序都要多,至少乍一看是这样。但事实上,menu.pro文件和qmake命令已隐藏了大量的设置,否则你必须在makefile文件中手工进行这些设置。

图17-11和图17-12显示了窗口中菜单和工具栏按钮的外观。

17.6 KDE的菜单和工具栏 - 图17

图 17-11

17.6 KDE的菜单和工具栏 - 图18

图 17-12

至此,我们已经学习完了Qt和KDE,并且介绍了GUI应用程序的基本元素,包括窗口、布局、按钮、对话框和菜单。但还有许多Qt和KDE构件未介绍,如QColorDialog(颜色选取对话框)、KHTML(Web浏览器构件)等,它们在Trolltech和KDE的网站上都有详细的文档介绍。