当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 20 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [Linux可视化编程系列二] 掀起 Gtkmm + libglademm 的盖头来
帖子发表于 : 2007-11-21 16:05 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
09年三月,Qt 4.5 采用 LGPL 授权了,几乎没有理由再用 Gtkmm :em06

───────────────────────────────────────────
[Linux可视化编程系列快速导航]
一、用 Anjuta 轻松搭建 Gtkmm+libglademm 开发环境
二、掀起 Gtkmm + libglademm 的盖头来
三、体验Glade的可视化界面设计
───────────────────────────────────────────

Gtkmm 类库的良好设计,使得学习Gtkmm程序的开发变得很容易。对于尝试过MFC的程序员,必将惊讶于Gtkmm的直观明了。

Glade 是可视化设计的不二之选。遗憾的是,有关 Gtkmm + libglademm 编程的文档实在太少,只在《Programming with gtkmm》第 23 章有提及(注:你也可以在DEVHELP的“gtkmm 2.4 library reference manual”中点击BOOK看到这本书)。我们的目标就是用 Gtkmm + libglademm 实现Linux的可视化编程,看看anjuta_using_glade.htm 这个Flash视频的演示,你就能领略到可视化编程的魅力。

这里,我们将从一个最简单、最基本的Gtkmm程序开始;然后稍作拓展,并结合libglademm得到我们自己的Helloworld程序。虽然Anjuta自动生成的那些代码也做了同样的事,但你后面会发现,我们的设计更优雅,更符合面向对象的思想。

你需要掌握C++的基本知识,这里将不作这方面的详细说明,以利于文档的简洁。特别是要求能够理解命名空间、继承和模板类等。


最简单的Gtkmm程序

《用 Anjuta 轻松搭建 Gtkmm+libglademm 开发环境》一文的anjuta_gtkmm.htm演示过程中,我们建立了一个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;
}


你可以将 main.cc 中的代码用上面的替换掉;然后,按SHIFT+F11生成可执行程序,并按F3运行它。


libglademm──搭起可视化的桥梁

“Glade 3”生成的文档是“XML”格式的。通过“libglademm”类库进行访问,可以得到其中定义的任一控件(widget)的指针(比如窗口、按钮等等)。于是,我们可以定义一个称为“HelloApp”的类,使它继承自“Gtk::Main”类。这样做的好处是,能结合“libglademm”类库,直接在本类方法中进行显示窗口的操作。

好!开始动手,添加一个“HelloApp”的类到工程中。这个anjuta_new_class.htm 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;
}

文件“hello-app.hpp”
代码:
/*这两行和最后一行为了防止重复包含头文件*/
#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_

文件“hello-app.cpp”
代码:
/* 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 );
   }
}


到此,我们已经完成了一个真正属于自己的、能运行的Helloworld程序,它具备 Gtkmm+libglademm 程序的基本骨架。

基础是打好了,但它什么也不能做。在下一篇中,我们将完成一个有用的程序,就是anjuta_using_glade.htm 这个Flash视频中所演示的。对它稍作修改就能用于IP地址查询的界面。
注:视频末尾所留的 MSN 已停止使用,请不要再通过它联系我!
。。。Hotmail 网页接口太慢,对 Firefox 太不友善。


附件:
文件注释: 下一篇实现的Gtkmm程序的截图
Screenshot-Hello-gtkmm.jpg
Screenshot-Hello-gtkmm.jpg [ 8.86 KiB | 被浏览 9987 次 ]


最后由 tipfoo 编辑于 2009-05-29 21:15,总共编辑了 7 次
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-21 20:15 

注册: 2007-10-19 21:15
帖子: 90
送出感谢: 0 次
接收感谢: 0 次
gtkmm似乎没有什么项目是基于它的吧。glade倒是不错。
gtk直接写就可以了吧。没必要增加cpp。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-21 20:55 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
panchoat 写道:
gtkmm似乎没有什么项目是基于它的吧。glade倒是不错。
gtk直接写就可以了吧。没必要增加cpp。


绝对不少!著名的 Inkscape 正在转向 gtkmm。
之前的这个帖子《用 Anjuta 轻松搭建 Gtkmm+libglademm 开发环境》中列出了几个用gtkmm的有名项目。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-24 20:25 
头像

注册: 2007-10-24 15:32
帖子: 108
地址: 四川省南充市
送出感谢: 1
接收感谢: 0 次
这种好贴,一定要收藏!!!!!!!!!!!!!!


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-25 0:26 
头像

注册: 2007-05-25 16:47
帖子: 881
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
兄弟,支持你,本想做这方面的东东,不过最近一直在出差,并且还有篇论文没有搞定,没有时间写啊


呵呵,不错不错,继续努力


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-28 16:39 
头像

注册: 2007-10-24 15:32
帖子: 108
地址: 四川省南充市
送出感谢: 1
接收感谢: 0 次
老大,anjuta2.3.0出来了,写个安装教程吧!我2.2.2都安装成功了的,但是2.3.0死活安装不上去。 :oops:


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-28 16:42 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
其实gtk够了。写法足够简单。


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-01-12 19:56 

注册: 2007-10-21 16:25
帖子: 65
送出感谢: 0 次
接收感谢: 0 次
请教楼主

错误: ‘Gtk’ 未声明

网上的方法都试了,要怎么搞啊?怎么设置都不对。。。


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-01-12 22:12 
头像

注册: 2005-10-13 18:29
帖子: 109
送出感谢: 0 次
接收感谢: 0 次
panchoat 写道:
gtkmm似乎没有什么项目是基于它的吧。glade倒是不错。
gtk直接写就可以了吧。没必要增加cpp。

inkscape


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-01-12 22:49 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
chrislu 写道:
请教楼主

错误: ‘Gtk’ 未声明

网上的方法都试了,要怎么搞啊?怎么设置都不对。。。


第几行?代码有点问题。

show_window()函数的注释多了个“*/”,我已经删掉了。


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-01-14 22:26 

注册: 2007-10-21 16:25
帖子: 65
送出感谢: 0 次
接收感谢: 0 次
/*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;
}

就是这段代码啊
我是在Ubuntu里,配置的Eclipse + CDT,装了Gtkmm,再建项目,输入那些代码,编译时,提示的:

Gtk 未声明


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-01-14 22:26 

注册: 2007-10-21 16:25
帖子: 65
送出感谢: 0 次
接收感谢: 0 次
就是用Gtk这行:
Gtk::Main app(argc, argv);


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-01-15 19:09 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
chrislu 写道:
我是在Ubuntu里,配置的Eclipse + CDT,装了Gtkmm,再建项目,输入那些代码,编译时,提示的:

Gtk 未声明

这是按Anjuta写的,既然你没有用Anjuta,那就需要告诉编译器 gtkmm.h 的路径,比如在编译器选项中指定:
-I/usr/include/libgtkmm-xxxxxxx 具体的,在论坛中的“C/C++”版搜索一下“pkg-config”。


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2008-01-16 12:55 
头像

注册: 2007-09-25 11:45
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
我喜欢这样的东西,楼主继续呀:) :lol:


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2008-02-02 14:17 
头像

注册: 2006-08-25 10:37
帖子: 736
送出感谢: 0 次
接收感谢: 0 次
gtk2.0 升级为gtkmm 了吗?

---赶不上形势的人.


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 20 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译