Linux下gtk程序示例

441 阅读1分钟

前言

一开始想从xlib开始学起,但是他api不太好用,所以只能在到上一层的封装,比如使用gtk这些库了,而在这个过程中,对Java GUI程序理解又深了一步,我们知道Java是可移植的,对于他的GUI在不同操作系统的实现,还是很复杂的,Java在Linux下的实现直接是使用xlib库,而对于高度抽象出Button、Image这些组件,还有布局管理器等这些,直接使用xlib还是有难度的,xlib也不提供这些,只提供窗口如何创建、怎么绘制,图像怎么摆放是上层的事情了。

而在Linux下工作,所以想学学GUI程序,起源是安装软件后,每次都要手动编辑desktop文件,放入~.local/share/applications/,比较麻烦,而java编写又需要安装java环境,比较麻烦,毕竟,想发布出去。

界面设计

但是,纯手编写所有代码还是很麻烦,无意间发现一个glade这个工具,他类似于VB的界面设计,只需要把控件托放到指定位置即可,他会生成一个窗口文件,是一个xml的格式,而gtk通过gtk_builder_add_from_file这个函数可以把xml文件解析成窗口,这样我们只专注逻辑的编写,十分方便。

下面是在manjaro下的安装方法

pamac install glade

下图是托放排列好的布局。

image.png

下面是窗口创建过程

int main(int argc, char **argv) {

    GtkBuilder *builder = NULL;
    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    if (gtk_builder_add_from_file(builder, "gtk.glade", NULL) == 0) {
        printf("gtk_builder_add_from_file FAILED\n");
        return 0;
    }
    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));

    execPathTextView = GTK_WIDGET(gtk_builder_get_object(builder, "text_view_exec_path"));
    desktopNameTextView = GTK_WIDGET(gtk_builder_get_object(builder, "text_view_desktop_name"));
    iconPathTextView = GTK_WIDGET(gtk_builder_get_object(builder, "text_view_icon_path"));
    applicationNameTextView = GTK_WIDGET(gtk_builder_get_object(builder, "text_view_application_name"));

    gtk_builder_connect_signals(builder, NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

完整代码如下:

https://github.com/houxinlin/linux-desktop-builder

image.png