[Linux可视化编程系列二] 掀起 Gtkmm + libglademm 的盖头来
2008-06-11 17:07
441 查看
Gtkmm 类库的良好设计,使得学习Gtkmm程序的开发变得很容易。对于尝试过MFC的程序员,必将惊讶于Gtkmm的直观明了。
Glade 是可视化设计的不二之选。遗憾的是,有关 Gtkmm + libglademm 编程的文档实在太少,只在《Programming with gtkmm》第 23 章有提及(注:你也可以在DEVHELP的“gtkmm 2.4 library reference manual”中点击BOOK看到这本书)。我们的目标就是用 Gtkmm + libglademm 实现Linux的可视化编程,看看这个Flash视频的演示,你就能领略到可视化编程的魅力。
这里,我们将从一个最简单、最基本的Gtkmm程序开始;然后稍作拓展,并结合libglademm得到我们自己的Helloworld程序。虽然Anjuta自动生成的那些代码也做了同样的事,但你后面会发现,我们的设计更优雅,更符合面向对象的思想。
你需要掌握C++的基本知识,这里将不作这方面的详细说明,以利于文档的简洁。特别是要求能够理解命名空间、继承和模板类等。
最简单的Gtkmm程序
在《用 Anjuta 轻松搭建 Gtkmm+libglademm 开发环境》一文的演示过程中,我们建立了一个Gtkmm工程。现在,请暂时忘掉Anjuta自动生成的那些代码,让我们从一个最简单的Gtkmm程序开始吧!它的有效源码只有六行,我们采用在中间穿插注释的方式,对它进行分析理解。
(tipfoo 原创作品,转载请注明出处: http://blog.csdn.net/tipfoo/ ,商业用途请联系作者<tipfoo@gmail#com>,未经授权,不得使用。)
你可以将 main.cc 中的代码用上面的替换掉;然后,按SHIFT+F11生成可执行程序,并按F3运行它。
libglademm──搭起可视化的桥梁
“Glade 3”生成的文档是“XML”格式的。通过“libglademm”类库进行访问,可以得到其中定义的任一控件(widget)的指针(比如窗口、按钮等 等)。于是,我们可以定义一个称为“HelloApp”的类,使它继承自“Gtk::Main”类。这样做的好处是,能结合“libglademm”类 库,直接在本类方法中进行显示窗口的操作。
好!开始动手,添加一个“HelloApp”的类到工程中。这个Flash视频演示了如何做。然后,用下面的代码替换对应文件中的所有内容。我们仍然采用在源码中间穿插注释的方式,对它们进行分析理解。
文件“main.cc”
文件“hello-app.hpp”
文件“hello-app.cpp”
到此,我们已经完成了一个真正属于自己的、能运行的Helloworld程序,它具备 Gtkmm+libglademm 程序的基本骨架。
基础是打好了,但它什么也不能做。在下一篇中,我们将完成一个有用的程序,就是这个Flash视频中所演示的。对它稍作修改就能用于IP地址查询的界面。
Glade 是可视化设计的不二之选。遗憾的是,有关 Gtkmm + libglademm 编程的文档实在太少,只在《Programming with gtkmm》第 23 章有提及(注:你也可以在DEVHELP的“gtkmm 2.4 library reference manual”中点击BOOK看到这本书)。我们的目标就是用 Gtkmm + libglademm 实现Linux的可视化编程,看看这个Flash视频的演示,你就能领略到可视化编程的魅力。
这里,我们将从一个最简单、最基本的Gtkmm程序开始;然后稍作拓展,并结合libglademm得到我们自己的Helloworld程序。虽然Anjuta自动生成的那些代码也做了同样的事,但你后面会发现,我们的设计更优雅,更符合面向对象的思想。
你需要掌握C++的基本知识,这里将不作这方面的详细说明,以利于文档的简洁。特别是要求能够理解命名空间、继承和模板类等。
最简单的Gtkmm程序
在《用 Anjuta 轻松搭建 Gtkmm+libglademm 开发环境》一文的演示过程中,我们建立了一个Gtkmm工程。现在,请暂时忘掉Anjuta自动生成的那些代码,让我们从一个最简单的Gtkmm程序开始吧!它的有效源码只有六行,我们采用在中间穿插注释的方式,对它进行分析理解。
(tipfoo 原创作品,转载请注明出处: http://blog.csdn.net/tipfoo/ ,商业用途请联系作者<tipfoo@gmail#com>,未经授权,不得使用。)
代码: |
/*Gtkmm程序的基本头文件,下面用到的两个类就由它定义*/ #include <gtkmm.h> int main (int argc, char *argv[]) { /* 每一个Gtkmm应用程序都必须有这样一个类的实例,并且必需是第一个生成的Gtk对象。 它对环境进行必要的初始化,需要用 argc 和 argv 两个参数对它进行实例化。 */ Gtk::Main app(argc, argv); /* 定义一个GTK的窗口类,默认地它以可执行程序名作为窗口标题。*/ Gtk::Window main_win; /* 显示窗口,并进入监听事件的循环状态,当窗口关闭时返回。*/ app.run(main_win); return 0; } |
libglademm──搭起可视化的桥梁
“Glade 3”生成的文档是“XML”格式的。通过“libglademm”类库进行访问,可以得到其中定义的任一控件(widget)的指针(比如窗口、按钮等 等)。于是,我们可以定义一个称为“HelloApp”的类,使它继承自“Gtk::Main”类。这样做的好处是,能结合“libglademm”类 库,直接在本类方法中进行显示窗口的操作。
好!开始动手,添加一个“HelloApp”的类到工程中。这个Flash视频演示了如何做。然后,用下面的代码替换对应文件中的所有内容。我们仍然采用在源码中间穿插注释的方式,对它们进行分析理解。
文件“main.cc”
代码: |
#include "hello-app.hpp" int main (int argc, char *argv[]) { /* 可以看到,这跟“最简单的Gtkmm程序”非常相似。HelloApp继承自 “Gtk::Main”类,也需要通过 argc 和 argv 两个参数进行实例化。 */ HelloApp app(argc, argv); /* 在这个函数中调用Gtk::Main::run函数来实现与上面相同的功能。 这里不需要窗口对象作参数,因为它已封装在HelloApp类中了。 */ app.show_window(); return 0; } |
代码: |
/*这两行和最后一行为了防止重复包含头文件*/ #ifndef _HELLO_APP_HPP_ #define _HELLO_APP_HPP_ #include <gtkmm.h> #include <libglademm/xml.h> /* 访问Glade文件所需的头文件 */ class HelloApp: public Gtk::Main /* 继承“Gtk::Main”类 */ { public: HelloApp(int argc, char *argv[]); ~HelloApp(); void show_window(); protected: /* 通过它访问Glade文件的内容,是一种智能指针,能自动释放占用的资源 */ Glib::RefPtr<Gnome::Glade::Xml> ref_xml; Gtk::Window* main_window; /* 存储主窗口的指针 */ }; #endif // _HELLO_APP_HPP_ |
代码: |
/* tipfoo<tipfoo@gmail#com> 原创作品,版权所有,出处: http://blog.csdn.net/tipfoo/ */ #include "hello-app.hpp" #include <iostream> /* 输出错误信息到控制台 */ #include <assert.h> /* assert()断言 */ using namespace Gnome::Glade; HelloApp::HelloApp(int argc, char *argv[]): Gtk::Main(argc,argv), /* 必须在初始化列表中调用父类的构造函数 */ main_window(0) /* 为主窗口的指针赋初值 */ { try { /* 从同目录下的GLADE文件创建“Gnome::Glade::Xml”对象 */ ref_xml = Xml::create("helloapp.glade"); } catch(const XmlError& ex) { /* 出错时错误信息输出到控制台,并返回 */ std::cerr << ex.what() << std::endl; return; } /* 取得主窗口的指针,存入main_window变量中,并确保成功。 main_window为0值表示失败,多是因为指定的控件名称不正确或不存在。 第一个参数就是Glade文件中定义的控件名称,是字符串型。 */ ref_xml->get_widget("main_window", main_window); assert(main_window); } HelloApp::~HelloApp() { /* 由于采用了智能指针,我们不需要管理资源的释放 */ } void HelloApp::show_window() { /* 如果取得主窗口的指针成功,就调用父类的run()函数显示它, 并进入监听事件的循环状态,当主窗口关闭时返回。 */ if (main_window) { run( *main_window ); } } |
基础是打好了,但它什么也不能做。在下一篇中,我们将完成一个有用的程序,就是这个Flash视频中所演示的。对它稍作修改就能用于IP地址查询的界面。
[align=center][/align]
_________________ |
相关文章推荐
- [Linux可视化编程系列一] 用 Anjuta 轻松搭建 Gtkmm+libglademm 集成开发环境(IDE)
- 利用XML进行GUI设计与运行时显示------基于GTK+/Gtkmm的Glade/libglade/libglademm
- [Linux可视化编程系列三] 体验Glade的可视化界面设计
- 另一个MVC框架------基于Gtkmm/libglademm的bakery
- linux中安装python科学计算环境-numpy、scipy、matplotlib、OpenCV...
- Caffe学习系列(12):训练和测试自己的图片--linux平台
- linux 下的多线程编程(fork && exec系列)
- Linux ranlib的用法
- VC++,掀起你的盖头来——谈VC++对象模型
- Linux 江湖系列阶段性总结
- linux 命令系列之 系统定时任务(73)
- IBM developerWorks 上 《Linux环境进程间通信》系列文章链接
- 风霄毅谈LinuxServer系列1-----常用命令序
- 读贴小摘《linux C/C++, 使用libflashplayer.so, 控制flash文件的播放》
- 转载和积累系列 - Linux常用命令记录
- linux下的sysstat系列
- 【Linux基本操作】系列02:vim的常用操作
- Linux-0.11内核源码分析系列:内存管理get_empty_page()与put_page()函数分析
- [Linux] PHP程序员玩转Linux系列-怎么安装使用
- hidden symbol `pthread_atfork' in /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a(pthread_atfork.oS