Gtk /Glade程式設計(三) 選單和工具欄

ztguang發表於2016-03-30
http://jianjiaosun.blog.163.com/blog/static/136124486201102774447729/

本文將http://zetcode.com/tutorials/gtktutorial/中“Menus and Toolbars in GTK+”一章中內容採用Glade進行介面設計的方法完成這一章中的例子,並且增加一些解釋說明和學習體會。
    Glade進行圖形化介面設計真的很給力,我以前也沒有進行過圖形介面相關的開發,雖然是學習過java,但是不是很喜歡,幾乎都是混過去的,最近因為自 己想寫一個東西,才開始學習使用glade進行介面設計,發現真的很方便。幾乎會了寫一個元件樂,其他的都是一樣的。

一、簡單的選單
1、建立一個視窗
2、新增選單
Gtk+/Glade程式設計(三) - unanao - unanao
 如上圖:選單就在“容器”中,滑鼠指的地方。
 這個圖時已經新增了“選單”。
3、為“退出”選單設定訊號處理。
    獲得物件:gtk_builder_get_object
   訊號處理:g_signal_connect
    還以獲得選單物件會相對複雜一些,但是Gtk+真是好用,獲得的方法居然和其它的組建一模一樣,其實想一想這是很正常的事情,只有windows才喜歡複雜的東西,Open Source的思想是K.I.S.S原則。

圖形介面設計完了,下面編寫我們的GTK+程式:
#include

gint main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkBuilder *builder;
    GtkWidget *quit_menu;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "simple-menu.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "imagemenuitem5"));

    gtk_widget_show_all(window);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(quit_menu, "activate", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();
    return 0;
}
編譯:$ gcc -o simple-menu simple-menu.c `pkg-config --libs --cflags gtk+-2.0`
執行:$ ./simple-menu
Gtk+/Glade程式設計(三) - unanao - unanao
     開始寫這個程式的時候,忘記寫gtk_main()了,結果一執行就退出了,感覺新增選單會複雜一些,在回宿舍的路上就想是吧return 0 寫在gtk_main()的前面了,原來是忘記寫gtk_main()了。晚上困了幹什麼都沒效率,所以建議時刻保持充沛的精神,精力充沛的一天比熬夜的 2天更有效果。

二、圖片選單和快捷鍵
2.1 設定選單的圖片:
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
在“常規”中,開啟“Custom label and image”,在下面有現則圖片。

2.2 設定快捷鍵
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 在“公共中”設定“加速鍵”,就可以使用Ctrl + q 退出視窗了。

2.3 Gtk+程式:
unanao@debian:~/Experiment/Programming/gui/menu-toolbars$ cat image-shortcuts.c
#include

gint main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkBuilder *builder;
    GtkWidget *quit_menu;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "image-shortcuts.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "quit_menu"));

    gtk_widget_show_all(window);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(quit_menu, "activate", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();
    return 0;
}
執行結果圖:

Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 
三、複選選單
在要新增複選選單處,右鍵選擇:“Edit”,如“檢視”:
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 在“檢視”上右鍵,選擇“Add child check item item”。

在視窗中新增“Status bar”
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao

編寫Gtk+程式碼:
unanao@debian:~/Experiment/Gui/menu-toolbars$ cat check-menu.c
#include

void toggle_statusbar(GtkWidget *widget, gpointer *status_bar)
{
    if (gtk_check_menu_item_get_active(widget))   
    {
        gtk_widget_show(GTK_WIDGET(status_bar));
    }
    else
    {
        gtk_widget_hide(GTK_WIDGET(status_bar));
    }
}

gint main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkBuilder *builder;
    GtkWidget *quit_menu;
    GtkWidget *status_bar;
    GtkWidget *tog_stat;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "image-shortcuts.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "quit_menu"));
    status_bar = GTK_WIDGET(gtk_builder_get_object(builder, "statusbar1"));
    tog_stat = GTK_WIDGET(gtk_builder_get_object(builder, "checkstatus"));

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT(quit_menu), "activate", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT(tog_stat), "activate", G_CALLBACK(toggle_statusbar), status_bar);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

 執行結果:
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 四、工具條
    工具條為最長用的功能提供快速訪問。
    這裡省略加視窗、垂直框和選單。
    新增工具條:
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
在toolbar上選擇“Edit...”。
 
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
選擇“Hierarchy” -->"新增",在“Edit Image” 的“保留ID”中選擇需要新增的圖片。

unanao@debian:~/Experiment/gui/menu-toolbars$ cat toolbar.c
/**
 * @file toolbar.c
 * @brief Simple Toolbar
 * @author unanao
 * @version 0.1
 * @date 2011-02-27
 */
#include

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkToolItem *quit;
    GtkBuilder *builder;

    gtk_init(&argc, &argv);

   
    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "toolbar.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));   
    quit = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "quit"));

    gtk_widget_show_all(window);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    //Attention please, here is "clicked"
    g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();
   
    return 0;
}
執行結果:
Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao
 
這樣點選紅色的關閉按鈕,就可以關閉這個視窗。

五、撤銷 重做
與四中新增“新建”中的方法相同,新增“撤銷”和“重做”按鈕。
編寫程式碼:
unanao@debian:~/Experiment/gui/menu-toolbars$ cat undo-redo.c
/**
 * @file undo_redo.c
 * @brief Simple Toolbar
 * @author unanao
 * @version 0.1
 * @date 2011-02-28
 */
#include
#include
#include

void undo_redo(GtkWidget *widget, gpointer item)
{
    static int count = 2;
    const char *name = gtk_widget_get_name(GTK_WIDGET(widget));
   
    if (strcmp(name, "undo") == 0)
    {
        count--;
    }
    else if (strcmp(name, "redo") == 0)
    {
        count++ ;
    }
    else
    {
        exit(1); //If the name is not "undo" and "redo" , it means that parameter is error
    }

    if (count < 0)
    {
        gtk_widget_set_sensitive(widget, FALSE);
        gtk_widget_set_sensitive(item, TRUE);       
    }
    else if (count > 5)
    {
        gtk_widget_set_sensitive(widget, FALSE);
        gtk_widget_set_sensitive(item, TRUE);       
    }

}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkToolItem *quit;
    GtkWidget *undo;
    GtkToolItem *redo;
    GtkBuilder *builder;

    gtk_init(&argc, &argv);

   
    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "toolbar.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));   
    quit = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "quit"));
    undo = (gtk_builder_get_object(builder, "undo"));
    redo = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "redo"));
    //undo = (gtk_builder_get_object(builder, "undo"));
    //redo = (gtk_builder_get_object(builder, "redo"));
    //printf below is used for debugging
    printf("undo: %s\n", gtk_widget_get_name(undo));
    printf("quit: %s\n", gtk_widget_get_name(quit));
    printf("window: %s\n", gtk_widget_get_name(window));

    gtk_widget_show_all(window);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    //Attention please, here is "clicked"
    g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(undo, "clicked", G_CALLBACK(undo_redo), redo);
    g_signal_connect(redo, "clicked", G_CALLBACK(undo_redo), undo);

    gtk_main();
   
    return 0;
}
gtk_widget_get_name存在一個bug:https://bugzilla.gnome.org/show_bug.cgi?id=614782。還沒有想好解決辦法。如果真的需要可以是這是用gtk+程式設計,而不是直接使用glade.


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(2792) | 評論(0) | 轉發(6) |
給主人留下些什麼吧!~~
評論熱議

相關文章