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;
}
執行結果圖:
三、複選選單
在要新增複選選單處,右鍵選擇:“Edit”,如“檢視”:
在“檢視”上右鍵,選擇“Add child check item item”。
在視窗中新增“Status bar”
編寫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;
}
執行結果:
四、工具條
工具條為最長用的功能提供快速訪問。
這裡省略加視窗、垂直框和選單。
新增工具條:
這樣點選紅色的關閉按鈕,就可以關閉這個視窗。
五、撤銷 重做
與四中新增“新建”中的方法相同,新增“撤銷”和“重做”按鈕。
編寫程式碼:
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、新增選單
如上圖:選單就在“容器”中,滑鼠指的地方。
這個圖時已經新增了“選單”。
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;
}
執行結果圖:
三、複選選單
在要新增複選選單處,右鍵選擇:“Edit”,如“檢視”:
在“檢視”上右鍵,選擇“Add child check item item”。
在視窗中新增“Status bar”
編寫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;
}
四、工具條
工具條為最長用的功能提供快速訪問。
這裡省略加視窗、垂直框和選單。
新增工具條:
在toolbar上選擇“Edit...”。
選擇“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;
}
執行結果:
五、撤銷 重做
與四中新增“新建”中的方法相同,新增“撤銷”和“重做”按鈕。
編寫程式碼:
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.
相關熱門文章
給主人留下些什麼吧!~~
評論熱議
相關文章
- Gtk+/Glade程式設計(一)--簡介程式設計
- Gtk+/Glade程式設計(二)--入門程式設計
- Gtk+/Glade 程式設計(四)佈局管理程式設計
- 工具欄選單
- 在PyQt中構建 Python 選單欄、選單和工具欄QTPython
- PyQt5中的選單和工具欄QT
- start11,自定義win11的選單欄和桌面欄工具
- mac選單欄設定教程Mac
- c#選單欄menustrip工具欄toolstrip狀態列C#
- ScreenSaverNow for Mac(選單欄防休眠工具)Mac
- 選單欄防休眠工具:ScreenSaverNow for MacMac
- 多功能選單欄時鐘工具:Dato
- 專案實踐-MD設計-底部選單欄(一)
- CSS實現的側欄三級導航選單程式碼CSS
- qt 設定選單欄顏色QT
- Airtool for Mac系統選單欄網路工具AIMac
- Bartender 3 for Mac選單欄管理工具Mac
- 系統選單欄網路工具:Airtool for MacAIMac
- Linux下的GTK圖形介面程式設計(轉)Linux程式設計
- cad選單欄和工具欄都不見了 cad功能區怎麼調出來
- wx選單欄
- 選單欄[MenuStrip]
- 選單欄日曆提醒工具:Calendar 366 II for MacMac
- Ext學習筆記8-資料模型及工具欄選單欄筆記模型
- Boring Old Menu Bar for Mac(選單欄美化工具)Mac
- 蘋果Mac必備:Dato 日曆和時區的選單欄時鐘工具蘋果Mac
- VC++環境下選單和工具欄的動態修改技術 (轉)C++
- 程式設計之 同步靜態方法和單例模式的選擇程式設計單例模式
- Java-GUI程式設計之選單元件JavaGUI程式設計元件
- python程式: 三級選單Python
- Linux 程式設計工具簡單介紹Linux程式設計
- 微軟更改Visual Studio設計 選單欄全部轉為大寫微軟
- QQ內建瀏覽器選單欄設定瀏覽器
- mac選單欄不顯示了,如何設定?Mac
- Launchey for Mac(選單欄上的熱鍵快速啟動工具)Mac
- Bartender 破解最新版5.0.48「選單欄管理工具」
- wxPython中工具欄、狀態列、選單實現薦Python
- UIWebView自定義選單欄UIWebView