21.10.2009 23:28
predator — Меню и панели инструментов в GTK+
ОригиналВ этой части руководства мы будем работат с меню и панелью управления.
Menubar является одними из самых частоиспользуемых компонентов графического интерфейса. Menubar это группа команд содержащихся в различных меню. При использовании консольных приложений вы должны запомнить все существующие в этой программе команды, в то время как, у программ с графическим интерфейсом все команды логически сгрупированы в группы. Здесь используются стандарты, которые в дальнейшем уменьшат время на изучение нового приложения.
Пример реализации простого меню.
В нашем первом примере мы создаем menu bar с одним елементом меню. Меню будет содержать только один пункт, при выборе которого приложение завершит работу.
Создание menu bar немного запутанно. Мы должны иметь ввиду, что и menu bar и menu получены из одного и того же виджета, называемого menu shell. Но только пункты меню(menu items) могут содержаться в меню. Они также используются для реализации подменю.
menubar = gtk_menu_bar_new();
filemenu = gtk_menu_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(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".
Меню с изображениями, мнемоники и акселераторы.
В следующем примере мы быльше узнаем о функциональности которую можем использовать в GTK+. Акселераторы это клавиатурные комбинации для активации пунктов меню. Мнемоники тоже клавиатурные комбинации, но для элементов интерфейса. Они представлены подчеркнутыми символами.
Этот пример показывает как добавить изображения к вашим пунктам меню. Как установить акселератор и как использовать мнемоники в вашем приложении.
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);
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);
open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
Здесь мы создаем два пункта меню с изображениями. Устанавливая второй параметр функции как NULL, мы автоматически создаем акселератор. Мы обеспечиваем изображение и текст для пунктов меню из внутренних ресурсов GTK+.
sep = gtk_separator_menu_item_new();
Устанавливает разделитель между пунктами. Тем самым, мы разделяем пункты на логические группы.
Пункт check menu.
GtkCheckMenuItem это пункт меню в виде checkbox'а;
В нашем примере мы показываем как можно использовать пункт меню в виде 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);
}
gtk_widget_show(statusbar);
} else {
gtk_widget_hide(statusbar);
}
Если пункт меню активирован, то строка состояния будет видна, а иначе, скрыта.
Панель инструментов.
Панель инструментов обеспечивает быстрый доступ к частоиспользуемым командам.
Это пример создает простую панель инструментов.
toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
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(GTK_TOOLBAR(toolbar), new, -1);
Создаем новую кнопку на панели из шаблона. Кнопки добавляются на панель с помошью функции gtk_toolbar_insert().
sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);
Вставляем разделитель.
Отменить - вернуть.
Следующий пример демонстрирует то, как мы можем сделать недоступными элементы панели инструментов. Это обычная практика в программировании пользовательского интерфейса. Посмотрим на примере кнопки сохранения документа. Если мы сохранили все изменения в нашем документе на диск, кнопка сохранения становится недоступной в большинстве редакторов текста. Тем самым, показывая, что все изменения уже сохранены.
Тут мы создаем кнопки возврата и отмены изменений из стандартных ресурсов 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(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() используется для того, чтобы сделать кнопку доступной/недоступной.
Ну во-первых не "вы" а "ты" :)
А выбрал по многим причинам:
1. исторически сложилось, я прожженный кедераст ;)
2. Qt на мой взгляд более красив что ли, банально нету ужасно длянных названий методов типа как: gtk_container_set_border_width, мало того стиль вида containerSetBorderWidth мне кажется более приятным чем подчеркивание.
3. Попалась книжка Бланшетта в руки на русском (еще для Qt3)
4. Получил работу над проектом на Qt. Еще когда он был третьим, потом был перерыв, сейчас у меня работа на Qt4
А выбрал по многим причинам:
1. исторически сложилось, я прожженный кедераст ;)
2. Qt на мой взгляд более красив что ли, банально нету ужасно длянных названий методов типа как: gtk_container_set_border_width, мало того стиль вида containerSetBorderWidth мне кажется более приятным чем подчеркивание.
3. Попалась книжка Бланшетта в руки на русском (еще для Qt3)
4. Получил работу над проектом на Qt. Еще когда он был третьим, потом был перерыв, сейчас у меня работа на Qt4
У него обалденная документация через Assistant, в нем синтаксис покрасивее будет (см. комментарий Vass выше), он выглядит красивее и в нем все больше и больше вкусностей. После того, как Trolltech был куплен Нокией и переименован в Qt Software дела у них идут более чем в гору — полностью открыт код под GPL, уверенность в будущем (не ждете же вы краха Нокии, так?), все новые и новые поддерживаемые платформы (мало того, что появились пакеты для Symbian, так еще и Maemo 5 на GTK, а Maemo 6 уже будет на Qt).
Библиотека движка WebKit для встраивания веб-страниц в приложения позволят любому начинающему программисту написать простой браузер для своего смарта Nokia.
Библиотека движка WebKit для встраивания веб-страниц в приложения позволят любому начинающему программисту написать простой браузер для своего смарта Nokia.
могу посоветовать codeblocks + wxWidgets. Видгеты используют гтк, а в кодеблоке есть дизайнер форм. В использовании все очень просто и понятно...
P.S. это конечно если вы хотите c\c++, есть же еще lazarus, в котором етсь отличный форм билдер, но это все под object pascal. так что найдется на любой вкус
Кстати, насколько я помню Лазарус может не только GTK, но и Qt, причем без изменения кода.
А есть для этого дела какой-нибудь хороший IDE?
Я погуглил, все предлагают Anjuta+Glade, но я так понял Глейд в Анюту ни фига не интегрирован. И не понятно: Анюта вообще в курсе о синтаксисе GTK+?