Видео смотреть бесплатно

Смотреть 365 видео

Официальный сайт avto4avto 24/7/365

Смотреть видео бесплатно

21.10.2009 23:28

predatorМеню и панели инструментов в GTK+

Оригинал
В этой части руководства мы будем работат с меню и панелью управления.

Menubar является одними из самых частоиспользуемых компонентов графического интерфейса. Menubar это группа команд содержащихся в различных меню. При использовании консольных приложений вы должны запомнить все существующие в этой программе команды, в то время как, у программ с графическим интерфейсом все команды логически сгрупированы в группы. Здесь используются стандарты, которые в дальнейшем уменьшат время на изучение нового приложения.

Пример реализации простого меню.



В нашем первом примере мы создаем menu bar с одним елементом меню. Меню будет содержать только один пункт, при выборе которого приложение завершит работу.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <gtk/gtk.h>

int main( int argc, char *argv
)
{

GtkWidget *window;
GtkWidget *vbox;

GtkWidget *menubar;
GtkWidget *filemenu;
GtkWidget *file;
GtkWidget *quit;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "menu");

vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

menubar = gtk_menu_bar_new();
filemenu = gtk_menu_new();

file = gtk_menu_item_new_with_label("File");
quit = gtk_menu_item_new_with_label("Quit");

gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect(G_OBJECT(quit), "activate",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}



Создание menu bar немного запутанно. Мы должны иметь ввиду, что и menu bar и menu получены из одного и того же виджета, называемого menu shell. Но только пункты меню(menu items) могут содержаться в меню. Они также используются для реализации подменю.

menubar = gtk_menu_bar_new();
filemenu = gtk_menu_new();


В этом фрагменте мы создаем menubar и меню.

gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);


Этот код реализует меню "Fail". Логически menu bar это menu shell. file menu тоже menu shell. Вот почему мы воспринимаем file menu как или subshell.

gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);


Пункт меню создается вызовом функции gtk_menu_shell_append(). Пункты меню добавляются к menu shell. В нашем случае, пункт "Quit" добавляется к меню "File", а меню "File" к menu bar.

g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL);


Здесь мы реализуем выход из программы при нажатии на пункт меню "Quit".
=simplemenu

Меню с изображениями, мнемоники и акселераторы.



В следующем примере мы быльше узнаем о функциональности которую можем использовать в GTK+. Акселераторы это клавиатурные комбинации для активации пунктов меню. Мнемоники тоже клавиатурные комбинации, но для элементов интерфейса. Они представлены подчеркнутыми символами.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>


int main( int argc, char *argv
)
{
GtkWidget *window;
GtkWidget *vbox;

GtkWidget *menubar;
GtkWidget *filemenu;
GtkWidget *file;
GtkWidget *new;
GtkWidget *open;
GtkWidget *quit;

GtkWidget *sep;

GtkAccelGroup *accel_group = NULL;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "menu");

vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

menubar = gtk_menu_bar_new();
filemenu = gtk_menu_new();

accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);

file = gtk_menu_item_new_with_mnemonic("_File");
new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL);
open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
sep = gtk_separator_menu_item_new();
quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);

gtk_widget_add_accelerator(quit, "activate", accel_group,
GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), sep);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect(G_OBJECT(quit), "activate",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}



Этот пример показывает как добавить изображения к вашим пунктам меню. Как установить акселератор и как использовать мнемоники в вашем приложении.

accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
...
quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);
gtk_widget_add_accelerator(quit, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);


Группа акселераторов это группа из клавиатурных комбинаций, обычно прикрепляемая к окну высшего уровня. Здесь мы создали акселератор "Ctrl + Q".

file = gtk_menu_item_new_with_mnemonic("_File");


Для того чтобы создать мнемонику, мы вызываем функцию gtk_menu_item_new_with_mnemonic(). Теперь открыть меню File можно нажатием клавиш Alt + F.

new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL);
open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);


Здесь мы создаем два пункта меню с изображениями. Устанавливая второй параметр функции как NULL, мы автоматически создаем акселератор. Мы обеспечиваем изображение и текст для пунктов меню из внутренних ресурсов GTK+.

sep = gtk_separator_menu_item_new();


Устанавливает разделитель между пунктами. Тем самым, мы разделяем пункты на логические группы.
=menu

Пункт check menu.



GtkCheckMenuItem это пункт меню в виде checkbox'а;

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <gtk/gtk.h>

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

int main( int argc, char *argv
)
{
GtkWidget *window;
GtkWidget *vbox;

GtkWidget *menubar;
GtkWidget *viewmenu;
GtkWidget *view;
GtkWidget *tog_stat;
GtkWidget *statusbar;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "view statusbar");

vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

menubar = gtk_menu_bar_new();
viewmenu = gtk_menu_new();

view = gtk_menu_item_new_with_label("View");
tog_stat = gtk_check_menu_item_new_with_label("View Statusbar");
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tog_stat), TRUE);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), viewmenu);
gtk_menu_shell_append(GTK_MENU_SHELL(viewmenu), tog_stat);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), view);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);

statusbar = gtk_statusbar_new();
gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, TRUE, 1);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect(G_OBJECT(tog_stat), "activate",
G_CALLBACK(toggle_statusbar), statusbar);

gtk_widget_show_all(window);

gtk_main();

return 0;
}



В нашем примере мы показываем как можно использовать пункт меню в виде checkbox'а.

tog_stat = gtk_check_menu_item_new_with_label("View Statusbar");


Создаем пункт меню в виде checkbox'а с помошью вызова функции
gtk_check_menu_item_new_with_label().

if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
gtk_widget_show(statusbar);
} else {
gtk_widget_hide(statusbar);
}


Если пункт меню активирован, то строка состояния будет видна, а иначе, скрыта.
=checkmenuitem

Панель инструментов.



Панель инструментов обеспечивает быстрый доступ к частоиспользуемым командам.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <gtk/gtk.h>

int main( int argc, char *argv
)
{
GtkWidget *window;
GtkWidget *vbox;

GtkWidget *toolbar;
GtkToolItem *new;
GtkToolItem *open;
GtkToolItem *save;
GtkToolItem *sep;
GtkToolItem *exit;

gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "toolbar");

vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);

gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new, -1);

open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), open, -1);

save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save, -1);

sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);

exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);

gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);

g_signal_connect(G_OBJECT(exit), "clicked",
G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}



Это пример создает простую панель инструментов.

toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);


Создаем новую панель инструментов. Мы делаем так, чтобы на панели были видны только иконки, без текста.

new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new, -1);


Создаем новую кнопку на панели из шаблона. Кнопки добавляются на панель с помошью функции gtk_toolbar_insert().

sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);


Вставляем разделитель.
=toolbar

Отменить - вернуть.



Следующий пример демонстрирует то, как мы можем сделать недоступными элементы панели инструментов. Это обычная практика в программировании пользовательского интерфейса. Посмотрим на примере кнопки сохранения документа. Если мы сохранили все изменения в нашем документе на диск, кнопка сохранения становится недоступной в большинстве редакторов текста. Тем самым, показывая, что все изменения уже сохранены.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <gtk/gtk.h>
#include <string.h>


void undo_redo(GtkWidget *widget, gpointer item)
{
static int count = 2;
const char *name = gtk_widget_get_name(widget);

if ( strcmp(name, "undo") ) {
count++;
} else {
count--;
}

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

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


int main( int argc, char *argv
)
{

GtkWidget *window;
GtkWidget *vbox;

GtkWidget *toolbar;
GtkToolItem *undo;
GtkToolItem *redo;
GtkToolItem *sep;
GtkToolItem *exit;


gtk_init(&argc;, &argv;);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "undoredo");

vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);


toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);

gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

undo = gtk_tool_button_new_from_stock(GTK_STOCK_UNDO);
gtk_widget_set_name(GTK_WIDGET(undo), "undo");
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), undo, -1);

redo = gtk_tool_button_new_from_stock(GTK_STOCK_REDO);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), redo, -1);

sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);

exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);

gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);


g_signal_connect(G_OBJECT(undo), "clicked",
G_CALLBACK(undo_redo), redo);

g_signal_connect(G_OBJECT(redo), "clicked",
G_CALLBACK(undo_redo), undo);

g_signal_connect(G_OBJECT(exit), "clicked",
G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}



Тут мы создаем кнопки возврата и отмены изменений из стандартных ресурсов GTK+. После нескольких применений одной из кнопок она становиться недоступной для нажатия, становится серой.

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

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


Вызов функции gtk_widget_set_sensitive() используется для того, чтобы сделать кнопку доступной/недоступной.
=undoredo


Тэги: Gtk+ GUI
+ 11 -
Похожие Поделиться

Vass 21.10.2009 23:52 #
+ 0 -
Немного оффтопика, от воина вражеской армии (Qt)
А есть для этого дела какой-нибудь хороший IDE?
Я погуглил, все предлагают Anjuta+Glade, но я так понял Глейд в Анюту ни фига не интегрирован. И не понятно: Анюта вообще в курсе о синтаксисе GTK+?
predator 21.10.2009 23:55 #
+ 0 -
Без понятия, я сам noob ещё.
predator 22.10.2009 00:21 #
+ 0 -
А почему вы выбрали QT?
Vass 22.10.2009 00:39 #
+ 2 -
Ну во-первых не "вы" а "ты" :)
А выбрал по многим причинам:
1. исторически сложилось, я прожженный кедераст ;)
2. Qt на мой взгляд более красив что ли, банально нету ужасно длянных названий методов типа как: gtk_container_set_border_width, мало того стиль вида containerSetBorderWidth мне кажется более приятным чем подчеркивание.
3. Попалась книжка Бланшетта в руки на русском (еще для Qt3)
4. Получил работу над проектом на Qt. Еще когда он был третьим, потом был перерыв, сейчас у меня работа на Qt4
Kraplax 23.10.2009 16:07 #
+ 0 -
У него обалденная документация через Assistant, в нем синтаксис покрасивее будет (см. комментарий Vass выше), он выглядит красивее и в нем все больше и больше вкусностей. После того, как Trolltech был куплен Нокией и переименован в Qt Software дела у них идут более чем в гору — полностью открыт код под GPL, уверенность в будущем (не ждете же вы краха Нокии, так?), все новые и новые поддерживаемые платформы (мало того, что появились пакеты для Symbian, так еще и Maemo 5 на GTK, а Maemo 6 уже будет на Qt).
Библиотека движка WebKit для встраивания веб-страниц в приложения позволят любому начинающему программисту написать простой браузер для своего смарта Nokia.
drujebober 22.10.2009 01:43 #
+ 2 -
vim жеж
Leliksan_Floyd 22.10.2009 01:52 #
+ 0 -
могу посоветовать codeblocks + wxWidgets. Видгеты используют гтк, а в кодеблоке есть дизайнер форм. В использовании все очень просто и понятно...
Leliksan_Floyd 22.10.2009 01:55 #
+ 0 -
P.S. это конечно если вы хотите c\c++, есть же еще lazarus, в котором етсь отличный форм билдер, но это все под object pascal. так что найдется на любой вкус
Kraplax 23.10.2009 16:08 #
+ 0 -
Кстати, насколько я помню Лазарус может не только GTK, но и Qt, причем без изменения кода.
Leliksan_Floyd 01.11.2009 14:55 #
+ 0 -
да, он может qt, gtk, gtk2, wince, carbon, cocoa. Только дело в том что большинство из этого в состоянии беты и может вести тебя не совсем адекватно

В хорошем качестве hd видео

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн