LINUX实验指导书(3)

2020-06-03 14:21

17 18 19 20 21 22 23 24 25 26 27 GtkWidget* ety_contains; //包含关键字输入文本框 GtkWidget* ety_not_contains; //不包含关键字输入文本框 GtkWidget* scroll_win; //用于显示日志的滚动窗口 GtkWidget* text; //显示日志多行文本框 GtkWidget* table; //用于摆放界面控件的表格布局 GtkWidget* dialog; //用于选择文件的对话框 GtkTextBuffer* buf; //显示日志的文字缓冲区 LogContent logContent; //完成文件检索、过滤填充的对象 //functions void layout_ctrls(); //放置界面控件 void onChooseFile(GtkWidget* sender,gpointer data); //点击选择文件时的动作 28 void onView(GtkWidget* sender,gpointer data); //点击查看日志文件按钮的动作 29 void onFileSelect(GtkWidget* widget,GtkFileSelection* fs); //在对话框中选择文件的动作 30 void dispLogNum(int num); //显示日志文件个数 31 void connectHandlers(); //关联界面控件和相应的事件处理程序 32 #endif 33 #ifndef WIDGET_H widget.h声明了与程序界面直接相关的变量和方法,其中的方法的实现部分即函数体在widget.cpp中。两个文件相结合,完成了程序界面的生成、界面控件元素和事件处理函数的关联、接收用户输入并反馈处理结果的功能,是用户之间交互的部分。 main.cpp 1 #include \2 #include \3 int main(int argc, char* argv[]){ 4 gtk_set_locale(); 5 gtk_init(&argc,&argv); 6 layout_ctrls(); //调用布局界面的方法,形成并显示图形用户界面 7 gtk_main(); 8 return 0; 9 } 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 #ifndef QTLOGVIEWER_H 2 #define QTLOGVIEWER_H 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include \11 12 13 14 15 16 17 using namespace std; class QtLogViewer:public QWidget{ Q_OBJECT private: string file_name; //记录文件名 string kw_contains; //日志过滤条件中,需要包含的关键字 string kw_not_contains; //日志过滤条件中,不需要包含的关键字 18 int file_num; //指定目录中,特定日志文件的个数 19 QLCDNumber* lcd_file_num; //用于显示文件个数的数码显示器 20 QLabel* lbl_file_name; 21 QLineEdit* le_contains; //包含关键字输入文本框 22 QLineEdit* le_not_contains; //不包含关键字输入文本框 23 QTextEdit* te_logs; //显示日志的多行文本框 24 QPushButton* btn_choose_file; //选择文件按钮 25 QPushButton* btn_view; //查看日志按钮 26 QGridLayout* grid; //摆放界面控件的表格布局 27 LogContent log; //检索、过滤并填充日志记录集合的对象 28 public: 29 QtLogViewer( QWidget *parent=0, const char *name=0 ); 30 public slots: //定义的信号槽 31 void onChooseFile(); //选择文件按钮的事件处理函数 32 void onView(); //查看日志条目按钮的事件处理函数 33 private: 34 void init(); //初始化界面和关联事件处理函数 35 int getFilesNumer(); //查询日志文件个数 36 string getFileName(); //检索日志文件名称 37 }; 38 #endif QtLogViewer派生自QWidget,集成了程序中所有的界面控件,并完成界面事件及其处理函数之间的关联。通过对LogContent的引用(引入log对象)组合进来了记录检索、过滤和填充的功能。 main.cpp 1 #include 2 #include \3 int main(int argc, char *argv[]){ 4 QApplication app(argc, argv); 5 QtLogViewer viewer; 6 app.setMainWidget(&viewer); 7 viewer.show(); 8 return app.exec(); 9 } 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目录下的代码相同。


LINUX实验指导书(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016年上海一模 电路选择专题汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: