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中,这点需要注意。
Arch下编译talkmm
星期天, 五月 31st, 2009Arch下talkmm编译指南
1.编译前准备的包
语音支持方面的包
yaourt -S speex ilbc linphone
界面支持方面的包
yaourt -S gtkmm libsexymm
2.下载源码包
wget http://talkmm.googlecode.com/files/libjingle-0.4.1.tar.bz2
wget http://talkmm.googlecode.com/files/talkmm-0.10.tar.bz2
3. 解压libjingle
tar xvfj libjingle-0.4.1.tar.bz2
cd libjingle-0.4.1
./configure
make
cd ..
4. 解压talkmm
tar xvfj talkmm-0.10.tar.bz2
cd talkmm-0.10
5. 连接libjingle目录
ln -s ../libjingle-0.4.1/talk src/talk
注意这是在talkmm-0.10目录里做的,并且libjingle-0.4.1目录就在talkmm-0.10同级目录中。
这是为了talkmm里的源码能连接到libjingle里生成的静态库.
6.编译talkmm
./autogen.sh
./configure
make
sudo make install
PS. Arch中gcc 4.4.0-3 版本在编译时似乎有个bug。目前只能跳过这个gcc的版本来编译.
如要指定ilbc位置,就以下面方式
./configure –with-ilbc=/usr/local
更正:前面说是4.4.0-3编译有bug,是我记错了。其实是4.4.0-2的bug,在线程同步方面。当时编译不过我就降级了,没想到过没多久gcc又升级并fix了这个bug。大家找的那个patch打上也无坏。它也修正了一些问题,我也已经把它加入svn中。
再次配置gtkmm交叉编译环境
星期天, 三月 29th, 2009Gtkmm有跨平台的特性。我决定发扬此特性,那先从port gtkmm到win
平台开始吧。那第一步就是配置gtkmm的win编译环境。网上大多文章都
介绍了在win下配置gtkmm的环境。而我之前也写过一篇介绍在linux下通
过mingw32来编译gtkmm程序的文章。
Gtkmm系列:交叉编译Window版本的Gtkmm程序示例
是的,我觉得这样才有意思,交叉编译嘛。
但是那一篇是参考别人的译作,方法有些繁琐,重要的是,已经不太适合
当前的环境了。主要是那个文章只支持到gtk28版本,目前的gtkmm已经
到2.16了。mingw32也是4.3的版本,众所周知,4.3版本的gcc语法严谨
多了。
经过昨天一晚上及今早的奋斗,和yetist双线合作,一人一种方法找环境配
置方法。目前完成了第一阶段的成功。
事实上,arch社区里是有gtk2的mingw32包,也就是说gtk+的交叉编译
环境是有人做好的了。只需要用yaourt就能安装配置完成。但gtkmm却
没有,yetist就循着这条线索,准备编译gtkmm的win32包。
而我在看了那些在win下配置gtkmm环境的文章后,想到,其实也只是下
载需要的库而已啊,而那些库,是组成gtkmm的基础,既然我现在是要编
译pe格式的程序,最终调用的不也是那些库嘛,那把win下的gtkmm开发
包转到linux下来给mingw32调用不就成了。于是照做,编译成功了又一个
gtkmm demo程序。
废话了这么多,那就正式开始交叉编译gtkmm之路吧。
很简单:
1.先下载gtkmm开发包
当然是for win的。http://ftp.acc.umu.se/pub/GNOME/binaries/win32/gtkmm/2.16/gtkmm-win32-devel-2.16.0-2.exe
2.16的开发包好啊,gtk+啥的都包含了。
但需要在win下安装解压出来,虽然是42M的大小,解出来有380M大。
安装完后从win分区里安装的gtkmm目录完整复制到linux分区中。我这里
放在/src/mingw32-gtkmm,你可以随便定义这个目录。只记住需要做个
链接即可,
sudo ln -s /src/mingw32-gtkmm /target
2.修正prefix路径
这是for win的开发包,所以还是需要修改一些东西的,主要是pkgconfig
的路径问题。
执行下面两个命令即可修正:
find /target/lib/pkgconfig -name "*.pc" |xargs sed -i ’s#prefix=c:\/devel\/target.*#prefix=\/target#’
find /target/lib/pkgconfig -name "*.pc" |xargs sed -i ’s#prefix=\/gtkmm_debug#prefix=\/target#’
3.安装mingw32
这步是安装编译器,pacman 也行,yaourt 也行.
sudo pacman -S mingw32
装好后执行下面命令可见:
i486-mingw32-g++ -v
Using built-in specs.
Target: i486-mingw32
Configured with: /home/sergej/community.cvs/devel/mingw32-gcc/src/gcc-4.3.0-20080502-mingw32-alpha-src/gcc-4.3.0/configure –target=i486-mingw32 –host=i686-pc-linux-gnu –build=i686-pc-linux-gnu –prefix=/usr –enable-languages=c,c++ –enable-sjlj-exceptions –enable-hash-synchronization –disable-nls –disable-libssp –disable-shared
Thread model: win32
gcc version 4.3.0 (GCC)
4.搞定
那么是搞定了吗?基本是完成了。
还是经典的测试代码:
#include <gtkmm/main.h>
#include <gtkmm/window.h>
int main(int argc, [...]
GMChess 0.10发布
星期四, 三月 26th, 2009正值svn版本号100,发布GMChess的第一个版本0.10吧。目前只有读谱功能,支持qq象棋,联众象棋,中游象棋,象棋演播室等软件生成的棋谱。
使用方法:选菜单->文件->打开,选择相应的棋谱文件即可
或者直接将棋谱拖到棋盘上即可打开。
本软件基于gtkmm库,以及开源程序象棋巫师的源码。因此非常感谢象棋巫师的作者黄晨先生,他的程序及网站给我提供了无限的资源及灵感。同时也感谢本软件另一作者wind,虽然他现在忙于工作而隐身中。
当然本人能力及精力有限,程序存在bug是难免的。目前gmchess也是在发展之中。0.1x系列的计划是完善读谱功能,因此大家如果在使用中发展读的谱不正常显示,可将谱一起发来(lerosua+gmchess at gmail.com)。而对电脑对战将会出现在0.2x系列的版本号中,请静静等待。
Linux下终将会有更多更好的象棋软件的,谢谢。
另外,征集程序中文名。欢迎各种意见及建议。
下载地址: gmchess-0.10
发件人 lerosua’ blog
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();
}
