• 页面

  • 功能

  • 标签

  • Gtkmm

    Gtkmm系列:交叉编译Window版本的Gtkmm程序示例

    星期一, 05月 26th, 2008

    Gtkmm是跨平台的,这句话听了很多次,倒是没怎么去试过。今天就试着在Linux下用mingw
    编译一个win32版本的Gtkmm测试程序试试。
    test.cpp
    #include <gtkmm/main.h>
    #include <gtkmm/window.h>
    int main(int argc, char **argv)
    {
    Gtk::Main main_obj(argc, argv);
    Gtk::Window win;
    main_obj.run(win);
    return 0;
    }
    上面是一个简单的gtkmm窗口程序。只会跳出一个窗口,啥也不干。
    平时在Linux编译是这样的:
    g++  test.cpp -o test  `pkg-config gtkmm-2.4 –cflags –libs`
    然而我们需要将它编译成win32的程序时呢。就要用到交叉工具链mingw了。
    首先在您的系统里安装mingw32软件包。在ubuntu或debian系统中可以通过apt管理工具获取
    软件:
    #apt-get install mingw32
    安装完毕后,您系统中应该有以下命令了:
    $ i586-mingw32msvc-g++ -v
    Reading specs from /usr/lib/gcc/i586-mingw32msvc/3.4.5/specs
    Configured with: /build/buildd/mingw32-3.4.5.20060117.1/build_dir/src/gcc-3.4.5-20060117-1/configure -v –prefix=/usr –target=i586-mingw32msvc –enable-languages=c,c++ –enable-threads –enable-sjlj-exceptions –disable-multilib –enable-version-specific-runtime-libs
    Thread model: win32
    gcc version 3.4.5 (mingw special)
    现在您已经有了交叉编译器,但是要跨平台编译Gtkmm,这时候还需要Gtkmm的win32开发库。
    恰巧 Inkscape 这个软件提供了打好包的Gtkmm win32开发库。
    到inkscape的win32指导地址 下载最新的gtk28-YYMMDD.7z 文件。在这里我下载的是
    gtk28-060502.7z(注意链接有可能失效)
    将这个文件解压到您想放置的地方,在这里我将之解压到了 /usr/local/gtk28
    创建一个链接:
    ln -sf /usr/local/gtk28 /target
    设置交叉编译用到的环境变量
    export PKG_CONFIG_PATH=/target/lib/pkgconfig
    现在,可以用交叉工具编译gtkmm的win32版本了。
    i586-mingw32msvc-g++ test.cpp  -o test.exe  `pkg-config [...]

    Gtkmm系列:TreeModelFilter的简单用法

    星期四, 03月 13th, 2008

    Gtkmm是Gtk+的C++绑定。不过在国内比较少开发者采用,因此中文资料也不多。
    彼人目前正在使用Gtkmm开发两个开源的项目。因此也学习了不少Gtkmm的用法。
    因此打算作一系列文章,探讨下Gtkmm里某些控件的用法。丰富一下中文Gtkmm
    资料。不过,这不是教程,有些文章会基于项目里的代码来说明,所以是面向
    有些基础的开发者的,让大家在搜索的时候能找到些资料,而这些说明又能帮
    到您的话,那我的目的就算是达到了。
    TreeModelFilter的简单用法
    TreeModelFilter是用于过滤TreeModel的一个类。或者这样说吧。
    这个功能大意就是查找匹配的好友成员,让其显示。
    这里将会作个简要的说明。代码说明基于 iCalk(http://code.google.com/p/icalk)
    声明好我们的TreeModelFilter成员在您的TreeView实现的头文件里。
    Glib::RefPtr <Gtk::TreeModelFilter> m_treemodelfilter;
    从TreeStore中生成TreeModelFilter:
    m_treemodelfilter = Gtk::TreeModelFilter::create(m_treestore);
    m_treestore 就是您代码中设置好的TreeStore类.
    用TreeModelFilter代替TreeStore类成为这个TreeView的model:
    set_model(m_treemodelfilter);
    这样将会使用你的TreeView里的元素成为可被过滤的。
    最后设置过滤函数:
    m_treemodelfilter->set_visible_func(sigc::mem_fun(*this,&BuddyView::
    list_visible_func));
    这个set_visible_func,将会依次调用TreeView里的元素,判断是否符合过滤条件,
    返回真则显示,返回假则隐藏。(BuddyView是icalk里的TreeView的继承类).
    然后再来看看这个过滤函数的内容:
    bool BuddyView::list_visible_func(const Gtk::TreeIter& iter)
    {
    /** 得到此列中表示好友成员的jabber id */
    Glib::ustring email = (*iter)[buddyColumns.id];
    /** 得到此列中表示好友成员的昵称*/
    Glib::ustring name  = (*iter)[buddyColumns.nickname];
    /** 得到此列中表示好友成员的类型,在icalk中,会设置为成员或组*/
    int type = (*iter)[buddyColumns.status];
    /** filterText是过滤的关键字,为空则返回真,即全部显示*/
    if(filterText.empty())
    return true;
    /** 在jabber id中查找是否匹配关键字 */
    else if(email.lowercase().find(filterText.lowercase())!=Glib::ustring::npos)
    return true;
    /** 在昵称中查找是否匹配关键字 */
    else if(name.lowercase().find(filterText.lowercase())!=Glib::ustring::npos)
    return true;
    /** 如果此列是一个组的话,返回真*/
    else if(type == STATUS_GROUP )
    return true;
    /** 以上条件都不匹配,返回假,隐藏*/
    return false;
    }
    在设置完毕之后,就需要发动过滤引擎了,我们只需要设置关键字filterText,然后
    调用一下m_treemodelfilter的成员函数refilter()就行了。 在icalk的代码里是:
    void BuddyView::setFilterText(const Glib::ustring& text)
    {
    filterText = text;
    m_treemodelfilter->refilter();
    }
    下来的工作是获取一个Gtk::Entry,让用户输入关键字。将这个关键字传递给上面
    的setFilterText()就可以了。更详细的代码可以参看icalk的BuddyView.cpp文件。