gtkmm文章:libglade转换至gtkbuilder
星期二, 八月 11th, 2009glade3界面生成器现在能生成两种格式的xml界面描述文件。分别是libglade和gtkbuilder. libglade就是我们以前所使用的,要依赖于libglade库的。而gtkbuilder是gtk 2.12以后版本直接支持的。gtkbuilder是设计来代替libglade的,将会是以后的主流。因此本文将简单介绍一下在gtkmm环境下libglade转换至gtkbuilder的操作。
1.转换旧的glade文件。
如果您的项目中已经用了libglade的文件格式,可通过两种方法将它转换成gtkbuilder格式的。
一是用glade-3打开,在菜单“属性”中将它选择成gtkbuilder,并另存为即可。
二是使用 gtk-builder-convert xxx.glade xxx.xml 命令直接转换。
当然gtkbuilder的后缀名仍可保留为glade,这随你喜欢。
2. 替换代码中的相应函数。
在创建xml文件中:
Glib::RefPtr<Gnome::Glade::Xml> main_xml = Gnome::Glade::create(main_ui,"main_notebook");
替换成
Glib::RefPtr<Gtk::Builder> main_xml = Gtk::Builder::create_from_file(main_ui, "main_notebook");
在获取widget中
Gtk::Button* button_ok = dynamic_cast<Gtk::Button*>(main_xml->get_widget("button_ok"));
替换成
Gtk::Button* button_ok=0;
main_xml->get_widget("button_ok",button_ok);
转换后,程序可以去除掉libglademm和libglade依赖,但至少要求gtk和gtkmm版本要2.14以上版本才能正常工作。另外libglade里画的菜单和工具栏似乎不能正常转到gtkbuilder中,这点需要注意。
gtkmm关闭窗口续
星期四, 三月 26th, 2009上一篇文章中讲到的窗口,点击关闭后只是隐藏了而已。窗口会一直存在。也许会觉得这样占用资源。当然也可以让它点击关闭即销毁它。只需要在run调用后detele掉它。但注意还需要把窗口指针置0
代码如下修改
about->run();
//about->hide();
delete about;
about=0;
Gtkmm中关于窗口的关闭按钮问题
星期三, 三月 25th, 2009之前用Gtkmm写icalk时创造了一个关于窗口,但它有个bug,关闭按钮没响应。昨天为GMChess创建关于窗口的时候再次遇到这个bug,这次我认真地搜索了一下,终于发现问题所在。
之前我都是创建完about窗口后,再调用show函数显示。
其实是应该调用run函数。我忘记了about窗口其实是dialog类,平时对话框之类不是要调用run然后观其返回值嘛,原来我无形中把about窗口当成window类了。发现有不少人有这错觉哩。而gnome-osd-properties的关于窗口也有关不掉的bug,哈哈哈。
下面给一个菜单调用about窗口的实例源码,
void MainWindow::on_menu_about()
{
static Gtk::AboutDialog* about(0);
if(about == 0){
std::vector<Glib::ustring> authors;
authors.push_back("lerosua ");
authors.push_back("wind");
about = new Gtk::AboutDialog ;
Glib::RefPtr<Gdk::Pixbuf> logo = Gdk::Pixbuf::create_from_file(DATA_DIR"/gmchess.png");
about->set_logo(logo);
about->set_program_name("GMChess");
about->set_version(version);
about->set_website("http://lerosua.org");
about->set_copyright("Copyright (c) 2009 lerosua");
about->set_comments(_("GMChess is chinese chess game write by gtkmm"));
about->set_authors(authors);
about->set_license (_("This program is licenced under GNU General Public Licence (GPL) version 2."));
about->set_translator_credits("lerosua");
}
//about->show();
//about->raise();
about->run();
about->hide();
}
