23 24 25 26 27 28 29 30 31 32 33 GtkTextBuffer* buf; //显示日志的文字缓冲区 LogContent logContent; //完成文件检索、过滤填充的对象 //functions void layout_ctrls(); //放置界面控件 void onChooseFile(GtkWidget* sender,gpointer data); //点击选择文件时的动作 void onView(GtkWidget* sender,gpointer data); //点击查看日志文件按钮的动作 void onFileSelect(GtkWidget* widget,GtkFileSelection* fs); //在对话框中选择文件的动作 void dispLogNum(int num); //显示日志文件个数 void connectHandlers(); //关联界面控件和相应的事件处理程序 #endif #ifndef WIDGET_H widget.h声明了与程序界面直接相关的变量和方法,其中的方法的实现部分即函数体在widget.cpp中。两个文件相结合,完成了程序界面的生成、界面控件元素和事件处理函数的关联、接收用户输入并反馈处理结果的功能,是用户之间交互的部分。 main.cpp 1 2 3 4 5 6 7 8 9 #include \#include \int main(int argc, char* argv[]){ gtk_set_locale(); gtk_init(&argc,&argv); layout_ctrls(); //调用布局界面的方法,形成并显示图形用户界面 gtk_main(); return 0; } main.cpp功能代码都很简单,除了常规的初始化程序环境的功能外,唯一特殊的就是调用widget.h中定义的layout_ctrils()方法,形成并显示界面。 3) 编译程序:
程序包含文件较多,可以采取分步编译的方式。由于代码中用到了类、string等概念,是C++风格的代码,因此,编译时采用g++命令,而不是gcc命令。g++命令和gcc命令使用方法参数信息都相同,g++用于C++风格代码而gcc常用于c风格的代码。
假设当前工作目录为项目的根目录即ViewLogGtk目录下,首先编译core目录下文件:
? 编译类Util:g++ -c core/Util.cpp
? 编译类LogRecord:g++ -c core/LogRecord.cpp ? 编译类LogContent:g++ -c core/LogContent.cpp
然后,编译main.cpp和widgets目录下的文件:
? g++ -c main.cpp -Icore -Iwidgets `pkg-config gtk+-2.0 --cflags --libs`
由于widges目录下的文件涉及到了Gtk+的界面部分,因此,在编译时需要加入`pkg-config ....`参数。 最后,将得到的目标文件编译为统一的可执行文件,并将可执行文件命名为ViewLog,命令:
? g++ -c LogRecord.o LogContent.o Util.o main.o -o ViewLog -Icore
-Iwidgets `pkg-config gtk+-2.0 --cflags --libs`
4) 运行程序:
? ./ViewLog
?
实验6
目的:练习Qt编程和qmake工具的使用。
需要的知识:C/C++语言的基本技能、第14章Qt图形程序设计;
题目:日志的查询统计是系统管理的一项重要任务。Linux系统的日志以文本文件的形式存在,使用Qt编写一个图形界面的系统日志管理器(针对日志文集/var/log/messages*),它可以列出系统当前的日志个数(/var/log/message, /var/log/message.1, /var/log/message.2,……共多少个),对指定日志文件可以查询哪些条目含有(include)指定信息(比如含有“succeed”的条目),哪些不含有(exclude)指定信息。
图6-1错误!未找到引用源。是一个示例程序的效果图: ? 数字1是一个Qt的LCD数码显示控件;
? 显示succeed的单行文本框用来输入包含的指定信息; ? 显示kernel的单行文本框用来输入不包含的指定信息;
? 点击标签为“/var/log/messages”的按钮后,可以选择日志文件; ? 点击标签为“View”的按钮后,可以根据输入的条件查看日志内容; ? 下面的多行文本框用来显示日志内容。
图6-1程序效果图
程序的目录结构如图6-2所示:
Util.h,Util.cpp core/ LogRecord,LogRecord.cpp LogContent,LogContent.cpp 当前目录./ widgets/ QtLogViewer.h, QtLogViewer.cpp main.cpp 图6-2程序目录结构图
其中:
? 目录core及其中文件的功能和实验5相同;
? 目录widgets及其中的文件功能和实验5相同,由于本实验不采用Gtk+界面工具包,
而是采用Qt界面工具包。因此,widgets目录下两个文件共同定义了一个类QtLogViewer,该类派生字QWidget类,完成图形界面构成、交互的功能;
? 文件main.cpp:为程序的主函数所在文件,通过对QtLogViewer的调用,完成程序的启
动、交互和退出。 实现步骤:
1) 根据目录结构创建目录和文件:
为了方便组织程序代码,可以将本实验的代码放到单独的目录下。因此,先建立一个目录作为项目的根目录,本例中根目录命名为:ViewLogQt。
? 在当前工作目录下,建立项目根目录:mkdir ViewLogQt ? 进入根目录:cd ViewLogQt
? 创建空白主程序文件:touch main.cpp ? 创建目录core:mkdir core
? 创建目录widgets:mkdir widgets ? 进入目录core:cd core
? 创建目录core下的空白程序文件:
touch Util.h touch Util.cpp
touch LogRecord.h touch LogRecord.cpp touch LogContent.h touch LogContent.cpp
? 进入目录widgets:cd ../widgets
? 创建目录widgets下的空白程序文件:
touch QtLogViewer.h touch QtLogViewer.cpp ? 目录文件创建完毕。
2) 编辑文件:
这里仅给出关键部分的代码。也可以参考实验5的代码。 QtLogViewer.h 1 2 3 4 5 6 7 8 9 10 11 #ifndef QTLOGVIEWER_H #define QTLOGVIEWER_H #include
利用qmake功能编译程序,首先创建qmake的工程文件,这里将工程文件命名为
LogViewer.pro:
? 生成项目文件,在项目根目录(ViewLogQt)下运行:
qmake -project -o LogViewer.pro ? 生成Makefile:qmake ? 生成程序:make 4) 运行程序:
? ./LogViewer
提示:由于目录core下的程序代码采用标准C++规范而没有用到Gtk+或者Qt的扩展功能。因此,可以重用实验5中core目录下的代码,即,本实验core目录下的代码和实验5中core目录下的代码相同。
相关推荐: