Linux系统应用与开发教程 第二版 刘海燕 荆涛综合实验 联系客服

发布时间 : 星期一 文章Linux系统应用与开发教程 第二版 刘海燕 荆涛综合实验更新完毕开始阅读

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 #include #include #include #include #include #include #include %using namespace std; 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 class QtLogViewer:public QWidget{ Q_OBJECT private: string file_name; //记录文件名 string kw_contains; //日志过滤条件中,需要包含的关键字 string kw_not_contains; //日志过滤条件中,不需要包含的关键字 int file_num; //指定目录中,特定日志文件的个数 QLCDNumber* lcd_file_num; //用于显示文件个数的数码显示器 QLabel* lbl_file_name; QLineEdit* le_contains; //包含关键字输入文本框 QLineEdit* le_not_contains; //不包含关键字输入文本框 QTextEdit* te_logs; //显示日志的多行文本框 QPushButton* btn_choose_file; //选择文件按钮 QPushButton* btn_view; //查看日志按钮 QGridLayout* grid; //摆放界面控件的表格布局 LogContent log; //检索、过滤并填充日志记录集合的对象 public: QtLogViewer( QWidget *parent=0, const char *name=0 ); public slots: //定义的信号槽 void onChooseFile(); //选择文件按钮的事件处理函数 void onView(); //查看日志条目按钮的事件处理函数 private: void init(); //初始化界面和关联事件处理函数 int getFilesNumer(); //查询日志文件个数 string getFileName(); //检索日志文件名称 }; #endif QtLogViewer派生自QWidget,集成了程序中所有的界面控件,并完成界面事件及其处理函数之间的关联。通过对LogContent的引用(引入log对象)组合进来了记录检索、过滤和填充的功能。 main.cpp 1 2 3 4 5 6 7 8 9 #include #include \int main(int argc, char *argv[]){ QApplication app(argc, argv); QtLogViewer viewer; app.setMainWidget(&viewer); viewer.show(); return app.exec(); } main.cpp功能代码都很简单,除了常规的初始化程序环境的功能外,唯一特殊的就是将QtLogViewer设为程序的主界面,利用QtLogViewer形成并显示界面。 3) 编译文件:

利用qmake功能编译程序,首先创建qmake的工程文件,这里将工程文件命名为

LogViewer.pro:

? 生成项目文件,在项目根目录(ViewLogQt)下运行:

qmake -project -o LogViewer.pro ? 生成Makefile:qmake ? 生成程序:make 4) 运行程序:

? ./LogViewer

提示:由于目录core下的程序代码采用标准C++规范而没有用到Gtk+或者Qt的扩展功能。因此,可以重用实验5中core目录下的代码,即,本实验core目录下的代码和实验5中core目录下的代码相同。