• GTK+-3.0编程 (五) GtkBuilder用于快速创建界面,它读取一个xml文件



    http://www.cnblogs.com/rain-blog/p/gtk3-5.html

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

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

    创建example.ui ,内容如下:

    <?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  ,内容如下:

    #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!
    ");
    }
    
    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('' != entry_buf[0])
            printf("%s
    " , 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);
        
    }

    编译,运行:

    gcc example.c `pkg-config --cflags --libs gtk+-3.0`
    ./a.out 

    运行结果如下:





  • 相关阅读:
    Windows XP下Qemu模拟器上OpenSolaris的安置
    图解SMC下Solaris用户图形经管(下)
    Solaris 10的功能
    在Solaris 下用DVD光盘保存数据(1)
    Solaris10下载、安设和设置装备摆设(2)
    Solaris 10密码忘记打点法子
    对Unix任事器进行性能监测(上)
    Solaris效力打点东西 SMF快速入门指南(3)
    Solaris 10主动安顿DVD运用步骤
    Solaris效劳经管器材 SMF疾速入门指南(2)
  • 原文地址:https://www.cnblogs.com/ztguang/p/12645236.html
Copyright © 2020-2023  润新知