Linux下大多数软件都是将core和UI完全分离,很多程序原作者只提供了CLI接口,而图形化接口则由另一些人完成。这种做法不仅减小了开发难度,缩短了开发周期,松散的耦合使程序更容易移植。这和很多windows程序形成了鲜明对比,尤其是MFC的程序,core代码和UI代码杂糅到doc/view的框架里,完全没有可移植性。
这学期写大作业想做个GUI,就顺便看了下MFC,觉得MFC现在的现在的地位十分尴尬,大型项目几乎清一色SDK,小型应用则是.net的天下,MFC被用的最多的莫过于CString了。一个Application Framwork已经退化成一个单纯的Class Library了。
暑假前的小学期,又有一个不大不小的作业,决定完全在Linux编写,并且Core和UI完全分离,有时间的话想用GTK做GUI。直接用C代码设计一个稍微复杂点GTK界面简直就是自找苦吃,于是上glade。
随便用Glade托了一个窗口拿来测试(用的是GtkBuilder而不是libglade,因为后者不支持很多gtk特性),保存成.glade文件,实际上就是一个xml文件。由于作业是用C++写的,所以想用gtk的C++ bindings gtkmm来,想让整个代码看起来比较统一。于是开始Google。很不幸的找到了一个错误的例子,导致XML文件总是导入不完全。后来找到了gtkmm的文档,发现里面竟然有很多源码例子,找到一个GtkBuilder的例子,改了下,程序就跑起来了
#include
#include
Gtk::Window* pWindow = 0;
int main (int argc, char **argv)
{
Gtk::Main kit(argc, argv);
//Load the GtkBuilder file and instantiate its widgets:
Glib::RefPtr refBuilder = Gtk::Builder::create();
try
{ //导入Glade生成的xml文件
refBuilder->add_from_file("mygui.glade");
}
catch(const Glib::FileError & ex)
{
std::cerr << "FileError: " << ex.what() << std::endl;
return 1;
}
catch(const Gtk::BuilderError & ex)
{
std::cerr << "BuilderError: " << ex.what() << std::endl;
return 1;
}
//Get the GtkBuilder-instantiated Window:
refBuilder->get_widget("window", pWindow);
if(pWindow)
{
kit.run(*pWindow);
}
delete pWindow;
return 0;
}
用G++编译
g++ phone.cpp `pkg-config --cflags --libs gtkmm-2.4`
后面几天主要还是些写核心代码和CLI,主要任务完成了再来接着折腾gtk~~~
4 Responses to Linux 下 gtkmm + glade 开发