16.9 CD数据库应用程序
在前面的章节中,你用MySQL和C语言接口开发了一个CD数据库应用程序。现在你将看到,用GNOME/GTK+给该程序创建一个GUI前端是多么容易,开发一个丰富的用户界面是多么快捷。
就像第8章中的CD数据库应用程序的需求一样,为运行本章中的CD数据库应用程序,你必须安装好了MySQL数据库和MySQL开发库。
为了简明起见,你将开发一个基础的、骨架式的用户界面,它仅实现应用程序的部分功能。例如,你不允许往CD里增加曲目信息或从CD里删除曲目信息。你将在这个应用程序里看到本章所介绍的构件的实际使用情况,这样你就可以了解它们在现实情况中是如何使用的了。
你将实现的主要功能有:
❑ 通过GUI登录数据库;
❑ 查找CD;
❑ 显示CD和曲目信息;
❑ 向数据库中增加一张CD;
❑ 创建一个“关于”(About)窗口;
❑ 在用户退出时进行确认。
你把代码分为3个源文件,它们共享同一个头文件cdapp_gnome.h。源文件将把创建窗口和对话框的函数——界面生成函数与回调函数分开。
实 验 cdapp_gnome.h
先来看看cdapp_gnome.h,它声明了那些你需要实现的函数。
(1)包含GNOME头文件和你在第8章中开发的接口函数所对应的头文件。这个示例程序使用了第8章中的app_mysql.h文件和app_mysql.c文件,以及该章中创建的数据库。
(2)枚举类型标记了GtkTreeView构件的列,你将用GtkTreeView来显示CD和曲目信息:
(3)在interface.c文件中有3个窗口创建函数:
(4)针对菜单项、工具栏、对话框按钮和搜索按钮的回调函数在callbacks.c文件中:
实 验 interface.c
接着,首先来看一下interface.c,该文件定义了你在应用程序中使用的窗口和对话框。
(1)首先是在callbacks.c和main.c中引用的一些构件指针:
(2)app是一个具备文件作用域的主窗口指针:
(3)定义一个辅助函数,它把一个带有指定文本标签的构件添加到容器中:
(4)为方便起见,菜单栏的定义使用了GNOMEUIINFO宏:
(5)创建主窗口,向其中添加菜单和工具栏,设置其大小,将它放置在屏幕中央,组装构成用户界面的构件。注意,这个函数并未在屏幕上显示窗口,而是返回一个指向窗口的指针。
(6)使用GTK+自带的图标来创建工具栏,并连接回调函数:
(7)创建用于搜索CD的构件:
(8)gtk_scrolled_window提供滚动条,使构件(在本例中是GtkTreeView)可以扩展超出窗口的大小:
(9)接下来,像通常那样用容器构件来排列界面元素:
(10)然后创建GtkTreeView构件,增加3列,并将其放在GtkScrolledWindow中:
(11)最后,设定主窗口的内容,增加一个GnomeAppbar,并连接必要的回调函数:
(12)下面的函数创建了一个简单的对话框,用来向数据库中添加一张新的CD。它包括艺术家、标题和类别的输入框,以及OK和Cancel按钮:
(13)用户在查询数据库之前需要先登录数据库。下面这个函数创建一个对话框,用于输入用户名和密码:
实 验 callbacks.c
文件callbacks.c包含用于UI构件的回调函数定义。
(1)首先,需要包含头文件和引用一些在interface.c中定义的全局变量,这样你就可以读取和更改某些构件的属性了:
(2)在quit_app中,调用database_end在退出前做清理工作并关闭数据库:
(3)接下来的函数弹出一个简单的对话框,用于确认你是否想要退出应用程序,并返回一个gboolean类型的响应:
(4)delete_event_handler是一个与主窗口的Gdk删除事件相连接的回调函数。这个事件在你试图关闭窗口时发送,但它位于GTK+destroy信号发出之前。
(5)下一个函数在用户点击增加CD对话框中的按钮时被调用。如果点击了OK按钮,程序将字符串复制到一个非const的字符数组中,并将其中的数据传递给MySQL的接口函数add_cd:
(6)这是整个应用程序的核心部分:获取搜索结果,并填充GtkTreeView。
(7)你从输入框构件中得到搜索字符串,将其复制到一个非const的变量中,然后获取匹配CD的ID:
(8)接着,更新appbar来显示一条消息,通知用户搜索结果:
(9)现在你得到了搜索结果,可以用它来填充GtkTreeStore了。对每个CD ID,你需要获取其对应的current_cd_st结构(这个结构包含了CD的标题和作曲家信息),然后获取其曲目列表。还要限制CD条目的总数不超过app_mysql.h中定义的MAX_CD_RESULT值,来确保GtkTreeStore不会溢出。
(10)addcd对话框是非模式的。因此,你需要在创建和显示它之前先检查它是否已存在:
(11)当点击About按钮时,一个标准的GNOME about(关于)窗口将弹出:
实 验 main.c
输入下面代码,将它命名为main.c,它包含这个程序的main函数。
(1)在include语句之后,你引用在interface.c中定义的用户名和密码输入构件:
(2)像通常一样初始化GNOME库,然后创建并显示主窗口和登录对话框:
(3)程序不断循环,直到用户输入了一个正确的用户名和密码。用户可以通过点击Cancel按钮退出,此时程序会询问他是否确认这个操作。
(4)如果database_start失败,它将显示一条错误信息,并重新显示登录对话框:
(5)你将编写一个makefile文件来编译这个应用程序。和第8章中一样,你可能需要添加mysqlclient库的路径,如下所示:
-L/usr/lib/mysql
在-L之后指定你的系统中放置MySQL库的目录。
(6)现在只需使用make命令来编译这个CD应用程序即可:
make -f Makefile
运行app,你将会看到一个GNOME风格的CD应用程序(如图16-15)。
图 16-15