前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 下从头再走 GTK+-3.0 (五)

Linux 下从头再走 GTK+-3.0 (五)

作者头像
RainMark
发布2019-09-10 19:38:35
1K0
发布2019-09-10 19:38:35
举报
文章被收录于专栏:RainMark 的文章RainMark 的文章

  实践中表明,纯粹利用 gtk 函数来创建 UI 是很繁琐的事,需要编写很多代码。怎样才能快速统一的建立 UI 布局呢?

可喜的是 GTK 提供了一个 GtkBuilder 用于快速创建界面。它读取一个 xml 文件。按照 xml 文件中所描述的来创建界面。因此我们需要编写 xml 文件。

创建example.ui ,内容如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<interface>
    <object id="window" class="GtkWindow">
        <property name="visible">True</property>
        <property name="title">GtkBuilder</property>
        <property name="border-width">30</property>
        <child>
            <object id="grid" class="GtkGrid">
                <property name="visible">True</property>
                <child>
                    <object id="print_hello" class="GtkButton">
                        <property name="visible">True</property>
                        <property name="label">Button 1</property>
                    </object>
                    <packing>
                        <property name="left-attach">0</property>
                        <property name="top-attach">0</property>
                    </packing>
                </child>
                <child>
                    <object id="print_entry" class="GtkButton">
                        <property name="visible">True</property>
                        <property name="label">Button 2</property>
                    </object>
                    <packing>
                        <property name="left-attach">1</property>
                        <property name="top-attach">0</property>
                    </packing>
                </child>
                <child>
                    <object id="entry" class="GtkEntry">
                        <property name="visible">True</property>
                    </object>
                    <packing>
                        <property name="left-attach">0</property>
                        <property name="top-attach">1</property>
                        <property name="width">2</property>
                    </packing>
                </child>
            </object>
            <packing>
            </packing>
        </child>
    </object>
</interface>

再创建源文件 example.c ,内容如下:

代码语言:javascript
复制
#include <gtk/gtk.h>

static void print_hello(GtkWidget *button , gpointer data);
static void activate(GtkApplication *app , gpointer data);
static void print_entry(GtkWidget * button , gpointer entry);

int main(int argc , char **argv)
{
    GtkApplication *app;
    int app_status;

    app = gtk_application_new("org.rain.example" , G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app , "activate" , G_CALLBACK(activate) , NULL);
    app_status = g_application_run(G_APPLICATION(app) , argc , argv);

    g_object_unref(app);
    return app_status;
}

static void print_hello(GtkWidget *button , gpointer data)
{
    printf("Hello,world!\n");
}

static void print_entry(GtkWidget * button , gpointer entry)
{
    const gchar *entry_buf;
    //获取输入框的内容,返回一个 const gchar 指针 , gchar 即是 char
    entry_buf = gtk_entry_get_text( GTK_ENTRY(entry) );
    if('\0' != entry_buf[0])
        printf("%s\n" , entry_buf);
}

static void activate(GtkApplication *app , gpointer data)
{
    GtkBuilder *builder;
    GObject *window;
    GObject *button;
    GObject *entry;

    //创建一个 GtkBuilder 。
    builder = gtk_builder_new();
    //将描述 UI 的文件添加到 Builder 中。
    gtk_builder_add_from_file(builder , "example.ui" , NULL);

    //可以用该函数获取 Builder 创建的对象,根据 example.ui 文件中设置的 object 的 id 来获取。
    window = gtk_builder_get_object(builder , "window");
    gtk_application_add_window(app , GTK_WINDOW(window));

    //注意该函数返回的是一个指向 GObject 对象的指针。
    button = gtk_builder_get_object(builder , "print_hello");
    //设置按钮标签
    gtk_button_set_label ( GTK_BUTTON (button) , "PrintHello");
    g_signal_connect(button , "clicked" , G_CALLBACK(print_hello) , NULL);

    //获取输入框对象。
    entry  = gtk_builder_get_object(builder , "entry");
    
    button = gtk_builder_get_object(builder , "print_entry");
    gtk_button_set_label ( GTK_BUTTON (button) , "PrintEntry");
    //调用 print_entry 时传递用户参数 entry 。
    g_signal_connect(button , "clicked" , G_CALLBACK(print_entry) , entry);
    
}

编译,运行:

代码语言:javascript
复制
gcc example.c `pkg-config --cflags --libs gtk+-3.0`
./a.out 

运行结果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档