решения для перехода
с Windows на Linux
|
|||
|
Правила нашего форума · Пользователи · Календарь · Помощь · Поиск |
|||
Здравствуйте, гость ( Вход | Регистрация ) Поиск ·
Приглашаем вас в jabber-конференцию о питоне на pythonua@conference.jabber.ru :)
Темы от студентов с запросами готовых решений по заданиям зарываются не глядя.
Jul 4 2007, в 16:05
Сообщение
#1
|
|
![]() Коренной житель Сообщений: 806 Вставить имя : Цитата ОС: ubuntu
Группа: Участники
|
Здравствуйте!
Согласно статистическим данным очень много людей интересуются созданием меню изучая http://linfoline.homedns.org/gtk/x1716.html но данный способ считается устаревшим и поэтому решил написать простой пример создания основного меню приложения с использованием менеджера меню http://linfoline.homedns.org/gtk-2.10-refe...kUIManager.html Для создания меню будет использоваться xml описание в виде отдельного файла menu.xml, хотя xml-описание можно включить непосредственно в код программы. Пример: CODE #include <gtk/gtk.h> // Функция формирования окна верхнего уровня GtkWidget* toplevel_window(); // Функция формирования панели меню GtkWidget* get_main_menu(); // Функция сообщающая об активации пункта меню void action_activate(); int main( int argc, char *argv[] ) { // Обязательный вызов для всех GTK+ программ gtk_init (&argc, &argv); // Создаём окно верхнего уровня GtkWidget *top_window = toplevel_window(); // Создаём основную панель меню GtkWidget *main_menu = get_main_menu(); // Вертикальный контейнер для упаковки панели меню GtkWidget *vbox = gtk_vbox_new(FALSE, 0); // Упаковываем вертикальный контейнер в основное окно gtk_container_add( GTK_CONTAINER(top_window), vbox); // Упаковываем панель меню в вертикальный контейнер gtk_box_pack_start( GTK_BOX(vbox), main_menu, FALSE, FALSE, 2); // Отображаем сформированные виджеты gtk_widget_show( vbox); gtk_widget_show( main_menu); gtk_widget_show( top_window); // Основной цикл GTK+ программ gtk_main (); return 0; } GtkWidget* toplevel_window() { // Создаём новый виджет - окно верхнего уровня GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // Устанавливаем заголовок окна gtk_window_set_title( (GtkWindow*)window, "Пример создания меню"); // Устанавливаем размер окна по умолчанию в пикселах gtk_window_set_default_size((GtkWindow*)window, 300, 100); // Подключаем обработчик к сигналу delete_event // то есть когда пользователь нажимает кнопку закрытия // в верхнем правом углу окна программы будет вызвана // функция gtk_main_quit для выхода из приложения g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); return (GtkWidget*)window; } GtkWidget* get_main_menu() { // Менеджер конструирования меню из xml описания GtkUIManager *ui = gtk_ui_manager_new(); // Действие для главных пунктов меню GtkActionGroup *menuactions; // Действие для подпунктов меню GtkAction *action; // Переменная для хранения произошедшей ошибки GError *error = NULL; // Панель меню GtkWidget *menubar; // Новая группа действий основного меню <Файл> menuactions = gtk_action_group_new("FileActions"); // Основное меню <Файл> action = gtk_action_new("FileAction", "Файл", NULL, NULL); // Добавляем действие в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее подменю <Создать> action = gtk_action_new("SubMenuAction", "Создать", NULL, NULL); // Добавляем дополнительное действие в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее пункт подменю <Новая вкладка> action = gtk_action_new("NewNotebookAction", "Новая вкладка", NULL, NULL); // Подключаем обработчик сигнала активизации меню g_signal_connect_swapped (G_OBJECT (action), "activate", G_CALLBACK (action_activate), "Новая вкладка"); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее пункт <Сохранить> action = gtk_action_new("SaveAction", "Сохранить", NULL, NULL); // Подключаем обработчик сигнала активизации меню g_signal_connect_swapped (G_OBJECT (action), "activate", G_CALLBACK (action_activate), "Сохранить"); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее пункт <Выход> action = gtk_action_new("QuitAction", "Выход", NULL, NULL); // Подключаем обработчик сигнала активизации меню g_signal_connect_swapped (G_OBJECT (action), "activate", G_CALLBACK (gtk_main_quit), NULL); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Добавляем группу действий в менеджер меню gtk_ui_manager_insert_action_group(ui, menuactions, 0); // Освобождаем переменную для создания следующего действия g_object_unref (menuactions); // Новая группа действий <Вид> menuactions = gtk_action_group_new("ViewMenuAction"); // Основное меню <Вид> action = gtk_action_new("ViewMenuAction", "Вид", NULL, NULL); // Добавляем действие в группу gtk_action_group_add_action(menuactions, action); // Дополнительное действие выводящее пункт <Подменю> action = gtk_action_new("SubMenuViewAction", "Подменю", NULL, NULL); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее пункт <Вид> action = gtk_action_new("ItemSubMenuAction", "Пункт подменю", NULL, NULL); // Подключаем обработчик сигнала активизации меню g_signal_connect_swapped (G_OBJECT (action), "activate", G_CALLBACK (action_activate), "Пункт подменю"); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Дополнительное действие выводящее пункт <Вид> action = gtk_action_new("ViewAction", "Вид", NULL, NULL); // Подключаем обработчик сигнала активизации меню g_signal_connect_swapped (G_OBJECT (action), "activate", G_CALLBACK (action_activate), "Пункт меню <Вид>"); // Добавляем в группу gtk_action_group_add_action(menuactions, action); // Освобождаем переменную для создания следующего действия g_object_unref (action); // Добавляем группу действий в менеджер меню gtk_ui_manager_insert_action_group(ui, menuactions, 0); // Освобождаем переменную g_object_unref (menuactions); // Формируем меню из xml описания gtk_ui_manager_add_ui_from_file(ui, "menu.xml", &error); menubar = gtk_ui_manager_get_widget( ui, "/menubar"); return menubar; } void action_activate(gchar *action) { // Создаём информационный диалог GtkWidget *dialog = gtk_message_dialog_new( NULL,\ GTK_DIALOG_DESTROY_WITH_PARENT,\ GTK_MESSAGE_INFO,\ GTK_BUTTONS_CLOSE,\ "%s",\ action); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } xml-описание нашего меню в виде отдельного файла menu.xml CODE <ui> <menubar> <menu name="Файл" action="FileAction"> <menu name="Создать" action="SubMenuAction"> <menuitem name="Новая вкладка" action="NewNotebookAction" /> </menu> <menuitem name="Сохранить" action="SaveAction" /> <separator/> <menuitem name="Выход" action="QuitAction" /> </menu> <menu name="Вид" action="ViewMenuAction"> <menu name="Подменю" action="SubMenuViewAction"> <menuitem name="Пункт подменю" action="ItemSubMenuAction" /> </menu> <menuitem name="View" action="ViewAction" /> </menu> </menubar> </ui> Скомпилировать пример можно командой gcc `pkg-config --cflags --libs gtk+-2.0` menu.c -o menu при условии что вы его поместили в файл menu.c и в вашей системе установлено всё необходимое
Прикрепленные файлы
-------------------- |
|
|
|
sergeyvp GTK+ в примерах Jul 4 2007, в 16:05
Zeus Кто-бы написал коротенький примерчик с GtkDrawArea... Jul 4 2007, в 17:57
sergeyvp Цитата(Zeus @ Jul 4 2007, в 18:57) Не вер... Jul 4 2007, в 19:01

Zeus Цитата(sergeyvp @ Jul 4 2007, в 20:01) Ци... Jul 4 2007, в 19:48

sergeyvp Цитата(Zeus @ Jul 4 2007, в 20:48) Вот эт... Jul 4 2007, в 19:59

Zeus Цитата(sergeyvp @ Jul 4 2007, в 20:59) Ци... Jul 4 2007, в 20:08

sergeyvp Цитата(Zeus @ Jul 4 2007, в 21:08) Как ра... Jul 4 2007, в 20:17
CPU Цитата(Zeus @ Jul 4 2007, в 18:57) Кто-бы... Jul 4 2007, в 21:33
Zeus Цитата(CPU @ Jul 4 2007, в 22:33) Цитата(... Jul 4 2007, в 21:45
CPU Цитата(Zeus @ Jul 4 2007, в 22:45) Цитата... Jul 4 2007, в 21:57
Zeus Спасибо. Утром попробую.
Опять этот expose_event.... Jul 5 2007, в 00:47
d_n_k Цитатаexpose-event
This is an event signal, initi... Jul 5 2007, в 10:01
Zeus В общем, резюме:
1. assert'ы не вываливаются.
... Jul 5 2007, в 10:09
d_n_k ЦитатаВопрос только: хранить ВСЁ в виде GtkWidget*... Jul 5 2007, в 10:35
Zeus Цитата(d_n_k @ Jul 5 2007, в 11:35) Цитат... Jul 5 2007, в 11:50
d_n_k это как тебе хочется, так и храни.
почти во всех ф... Jul 5 2007, в 12:22
Zeus Продолжаю "развлекаться" с gtk.
В GtkDra... Jul 5 2007, в 18:02
CPU Цитата(Zeus @ Jul 5 2007, в 19:02) Продол... Jul 5 2007, в 20:04
Zeus CPU
Спасибо большое. Утром скомпилю-запущу...
Смо... Jul 6 2007, в 00:07
Zeus Есть класс "окна".
У него есть статическ... Jul 9 2007, в 13:24
CPU Цитата(Zeus @ Jul 9 2007, в 14:24) Так во... Jul 9 2007, в 23:08
Zeus Цитата(CPU @ Jul 10 2007, в 00:08) Цитата... Jul 9 2007, в 23:27
CPU Что-то не то..
Вот, смотри - я переделал пример с ... Jul 10 2007, в 00:18
Zeus expose_event и у меня работает.
Не работает (пока ... Jul 10 2007, в 00:22
CPU Может, тогда прикрепишь цельный пример, который па... Jul 10 2007, в 00:24
Zeus Он на работе. С утра прикреплю.
Только, боюсь, ес... Jul 10 2007, в 00:26
CPU Цитата(Zeus @ Jul 10 2007, в 01:26) Он на... Jul 10 2007, в 00:29
Zeus Цитата(CPU @ Jul 10 2007, в 01:29) Любой ... Jul 10 2007, в 00:36
Zeus Вот файл с "проектом".
Если "двинут... Jul 10 2007, в 09:07
d_n_k науке неизвестно что находится в стеке в момент вы... Jul 10 2007, в 13:04
Zeus Хгм.... значит у функций отклика на сигналы ещё и ... Jul 10 2007, в 13:48
CPU Цитата(Zeus @ Jul 10 2007, в 14:48) Кодgb... Jul 10 2007, в 23:22
Zeus Цитата(CPU @ Jul 11 2007, в 00:22) Цитата... Jul 11 2007, в 00:20
CPU Цитата(Zeus @ Jul 11 2007, в 01:20) Спаси... Jul 11 2007, в 20:05
Zeus Цитата(CPU @ Jul 11 2007, в 21:05) Цитата... Jul 11 2007, в 21:33
d_n_k вполне нормально
совет: не пользуй функции типа ... Jul 11 2007, в 09:46
Zeus Цитата(d_n_k @ Jul 11 2007, в 10:46) впол... Jul 11 2007, в 10:22
d_n_k самое полное руководство - это код проги
еще можно... Jul 13 2007, в 09:47 ![]() |
|
Текстовая версия | Сейчас: 9th February 2010 - в 02:50 |
|
> Игрушки > подшипники для пользователей linux > распродажа диванов, диваны и кресла > Купить полиэтиленовые пакеты с логотипом в Москве |
> офисный переезд > Недорого купить диван: диваны и кресла > Надежные компьютеры с операционной системой Linux > Только у нас элитная недвижимость в Москве для Вас |
> Топографические, векторные, спутниковые GPS карты на mapsshop.ru > Купить сотовый телефон на Sotmarket.ru > именно сейчас продажа кондиционеров лучше не найдете > Новинки мобильных телефонов по лучшим ценам, интернет магазин сотовых телефонов |