Gtk /Glade程式設計(三) 選單和工具欄
http://jianjiaosun.blog.163.com/blog/static/136124486201102774447729/
本文將http://zetcode.com/tutorials/gtktutorial/中“Menus and Toolbars in GTK+”一章中內容採用Glade進行介面設計的方法完成這一章中的例子,並且增加一些解釋說明和學習體會。
Glade進行圖形化介面設計真的很給力,我以前也沒有進行過圖形介面相關的開發,雖然是學習過java,但是不是很喜歡,幾乎都是混過去的,最近因為自 己想寫一個東西,才開始學習使用glade進行介面設計,發現真的很方便。幾乎會了寫一個元件樂,其他的都是一樣的。
一、簡單的選單
1、建立一個視窗
2、新增選單
如上圖:選單就在“容器”中,滑鼠指的地方。
這個圖時已經新增了“選單”。
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_main()了,結果一執行就退出了,感覺新增選單會複雜一些,在回宿舍的路上就想是吧return 0
寫在gtk_main()的前面了,原來是忘記寫gtk_main()了。晚上困了幹什麼都沒效率,所以建議時刻保持充沛的精神,精力充沛的一天比熬夜的
2天更有效果。
二、圖片選單和快捷鍵
2.1 設定選單的圖片:
在“常規”中,開啟“Custom label and image”,在下面有現則圖片。
2.2 設定快捷鍵
在“公共中”設定“加速鍵”,就可以使用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](https://i.iter01.com/images/d04c6b0d099862c0bf50a9694eed130b5b415c5fb7c0c623243bd0c710576aa3.gif)
三、複選選單
在要新增複選選單處,右鍵選擇:“Edit”,如“檢視”:
在“檢視”上右鍵,選擇“Add child check item item”。
在視窗中新增“Status bar”
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/83c3e25a904e14e5dffa9c3ea8fca2192567b19e04c6ee4f4f4de2be634cc374.gif)
編寫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](https://i.iter01.com/images/e112384ca472a236ba743a4d576ccde8f7eef91f53a115d0aed50a346dce0623.gif)
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/e67c7cac97557a2d528828a1939d672e54302b7e46cfba89d641e743e21b069b.gif)
這樣點選紅色的關閉按鈕,就可以關閉這個視窗。
五、撤銷 重做
與四中新增“新建”中的方法相同,新增“撤銷”和“重做”按鈕。
編寫程式碼:
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.
閱讀(2792) | 評論(0) | 轉發(6) |
<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>
本文將http://zetcode.com/tutorials/gtktutorial/中“Menus and Toolbars in GTK+”一章中內容採用Glade進行介面設計的方法完成這一章中的例子,並且增加一些解釋說明和學習體會。
Glade進行圖形化介面設計真的很給力,我以前也沒有進行過圖形介面相關的開發,雖然是學習過java,但是不是很喜歡,幾乎都是混過去的,最近因為自 己想寫一個東西,才開始學習使用glade進行介面設計,發現真的很方便。幾乎會了寫一個元件樂,其他的都是一樣的。
一、簡單的選單
1、建立一個視窗
2、新增選單
![Gtk+/Glade程式設計(三) - unanao - unanao](https://i.iter01.com/images/2d780153bb26e2a90ecd1edf93dc23a06384888322ef246b9a8c2f35917a7012.gif)
這個圖時已經新增了“選單”。
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](https://i.iter01.com/images/fae1c32218b60ad8cdf358b819fbc052653271b4d3753600f918f4bc233e1299.gif)
二、圖片選單和快捷鍵
2.1 設定選單的圖片:
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/b439f209ebcb7317398e0dbdc86cbff0f926b9f9d2e080cd9dc29f1607b436de.gif)
2.2 設定快捷鍵
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/d01bb6f02efe4f2a519d9150c3873c30ec085d046afa952d9aedc45ddf889c95.gif)
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](https://i.iter01.com/images/d04c6b0d099862c0bf50a9694eed130b5b415c5fb7c0c623243bd0c710576aa3.gif)
三、複選選單
在要新增複選選單處,右鍵選擇:“Edit”,如“檢視”:
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/501cc62136a8c9908f50804a4d373d9d12b78ddfc145e01a67bde5e53d5a1590.gif)
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/a9a3c646c1228d268e22bd9aa05544ff985db828f931225c1a748f81ef2957a3.gif)
在視窗中新增“Status bar”
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/83c3e25a904e14e5dffa9c3ea8fca2192567b19e04c6ee4f4f4de2be634cc374.gif)
編寫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](https://i.iter01.com/images/3ba58c80dd851a4ccca6e939b20c264e8c5860e5377e0441471a73d80f2dd355.gif)
工具條為最長用的功能提供快速訪問。
這裡省略加視窗、垂直框和選單。
新增工具條:
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/e112384ca472a236ba743a4d576ccde8f7eef91f53a115d0aed50a346dce0623.gif)
在toolbar上選擇“Edit...”。
![Gtk+/Glade程式設計(三) 選單和工具欄 - unanao - unanao](https://i.iter01.com/images/e67c7cac97557a2d528828a1939d672e54302b7e46cfba89d641e743e21b069b.gif)
選擇“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;
}
執行結果:
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](https://i.iter01.com/images/240b3c273d298484c8ec8a39708acccb708265ffaa9fdf9be770cd5ae81aeed9.gif)
五、撤銷 重做
與四中新增“新建”中的方法相同,新增“撤銷”和“重做”按鈕。
編寫程式碼:
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.
相關熱門文章
給主人留下些什麼吧!~~
評論熱議
相關文章
- 在PyQt中構建 Python 選單欄、選單和工具欄QTPython
- 工具欄選單
- start11,自定義win11的選單欄和桌面欄工具
- 選單欄防休眠工具:ScreenSaverNow for MacMac
- ScreenSaverNow for Mac(選單欄防休眠工具)Mac
- mac選單欄設定教程Mac
- 專案實踐-MD設計-底部選單欄(一)
- 多功能選單欄時鐘工具:Dato
- cad選單欄和工具欄都不見了 cad功能區怎麼調出來
- 系統選單欄網路工具:Airtool for MacAIMac
- Bartender 3 for Mac選單欄管理工具Mac
- Airtool for Mac系統選單欄網路工具AIMac
- 用jsonrpc2連線gtk程式和go程式JSONRPCGo
- mac選單欄語言翻譯工具:Linguist for MacMacNGUI
- 選單欄日曆提醒工具:Calendar 366 II for MacMac
- Boring Old Menu Bar for Mac(選單欄美化工具)Mac
- python程式: 三級選單Python
- Java-GUI程式設計之選單元件JavaGUI程式設計元件
- 蘋果Mac必備:Dato 日曆和時區的選單欄時鐘工具蘋果Mac
- mac選單欄不顯示了,如何設定?Mac
- QQ內建瀏覽器選單欄設定瀏覽器
- Bartender 破解最新版5.0.48「選單欄管理工具」
- Launchey for Mac(選單欄上的熱鍵快速啟動工具)Mac
- 簡單理解非同步程式設計(python)和非同步程式設計(nodejs)非同步程式設計PythonNodeJS
- Airtool for Mac(系統選單欄網路工具) 2.5.3啟用版AIMac
- Bartender 4 for Mac(Mac選單欄應用管理工具)中文Mac
- ScreenSaverNow for Mac(選單欄防休眠工具) v1.70啟用版Mac
- WebStorm程式設計工具WebORM程式設計
- 程式設計師,選擇和努力哪個重要?程式設計師
- MFC程式設計(三)C程式程式設計
- ‘程式語言‘ ’程式設計工具’程式設計
- 怎樣用 Bash 程式設計:語法和工具程式設計
- Bash程式設計基礎之語法和工具程式設計
- Java程式設計師必備的工具和框架Java程式設計師框架
- 選單欄快捷命令:QuickLinks for MacUIMac
- PyQt5 之選單欄QT
- QuickLinks for Mac(選單欄快捷命令)UIMac
- 如何實現公眾號選單欄跳轉小程式
- 電腦科學和Python程式設計導論(三) 一些簡單的數值程式Python程式設計