[*nix, C] Создаём приложение на gtk
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Я вижу часто отсылки на то, как реализуется то или иное на qt, но gtk тоже хорош. Я пишу на C и не хочу учить каждые три года стандарты C++, чтобы быть на волне. Мне хватает простой сишечки и чтобы делать графический софт, выбор пал на gtk.
Документацию к нему я использую в программе devhelp. Итак начнем.
Первое что нужно сделать, это создать приложение, которое будет видно на dbus шине.
GtkApplication *app;
static void app_activate_cb ( GtkApplication *app, gpointer user_data ) {
}
int main ( int argc, char **argv ) {
app = gtk_application_new ( "com.xverizex.configurator", G_APPLICATION_FLAGS_NONE );
g_application_register ( ( GApplication * ) app, NULL, NULL );
g_signal_connect ( app, "activate", G_CALLBACK ( app_activate_cb ), NULL );
return g_application_run ( ( GApplication * ) app, argc, argv );
}
После того, как приложение активировалось, нужно наполнить его виджетами. Я создаю в этом файле структуру, которая будет хранить все виджеты, которые будут изменяться в оформлении, если указать другую цветовую схему.
вот структура.
struct widgets {
GtkWidget *main_window;
GtkWidget *notebook;
GtkWidget *tree_view_sources;
GtkWidget *label_tab_sources;
GtkWidget *header_bar;
GtkWidget *search_entry;
GtkWidget *button_add_item;
GtkWidget *tree_view_reactions;
GtkWidget *label_tab_reactions;
GtkWidget *window_add_source;
...
GtkWidget *STUBS;
в конце я создаю специальную переменную, так называемую STUBS, которой я ничего не присваиваю. В приложении виджетов очень много и нужен какой то способ присвоить нужным виджетам нужное имя. Я делаю это так.
static void set_theme_name ( const char *name ) {
struct widgets **p = ( struct widgets ** ) &w;
for ( int i = 0; p[i] != NULL; i++ ) {
gtk_widget_set_name ( ( GtkWidget * ) p[i], name );
}
char buf[255];
snprintf ( buf, 255, "%s_info", name );
gtk_widget_set_name ( w.label_info_db_settings, buf );
gtk_widget_set_name ( w.label_info_mail_settings, buf );
}
тем виджетам, которым нужно ещё особенное оформление, я уже назначаю им отдельные названия. В этой функции я пробегаю по всем виджетам и указываю им имя темы.
Для создания меню используюется вот такой код.
static void create_actions ( void ) {
const GActionEntry entries[] = {
{ "quit", action_activate_quit },
{ "settings", action_settings },
{ "apply_settings", action_activate_apply_settings },
{ "select_light_theme", action_activate_select_light_theme },
{ "select_dark_theme", action_activate_select_dark_theme },
{ "select_standard_theme", action_activate_select_standard_theme }
};
g_action_map_add_action_entries ( G_ACTION_MAP (app), entries, G_N_ELEMENTS (entries), NULL );
}
И потом назначаем эти команды в меню.
pop_menu = g_menu_new ( );
GMenu *menu_app = g_menu_new ( );
GMenu *menu_themes = g_menu_new ( );
g_menu_append ( menu_app, "Настройки", "app.settings" );
g_menu_append ( menu_app, "Обновить", "app.apply_settings" );
g_menu_append ( menu_themes, "Светлая тема", "app.select_light_theme" );
g_menu_append ( menu_themes, "Темная тема", "app.select_dark_theme" );
g_menu_append ( menu_themes, "Стандартная тема", "app.select_standard_theme" );
g_menu_append_submenu ( menu_app, "Сменить тему", ( GMenuModel * ) menu_themes );
g_menu_append ( menu_app, "Выход", "app.quit" );
gtk_application_set_app_menu ( app, ( GMenuModel * ) menu_app );
В итоге пописав это приложение, оно превращается в нечто прекрасное и красивое.
===========
Источник:
habr.com
===========
Похожие новости:
- [Agile, Интервью, Управление персоналом, Управление проектами] Однодневный спринт — реальность или вымысел?
- [Браузеры, Разработка под Android] Vivaldi 3.3 для Android — Панельная свобода
- [C#, ООП, Программирование] Волшебные методы в C# (перевод)
- [IT-инфраструктура, Информационная безопасность, Сетевые технологии] 2. Group-IB. Комплексная защита сети. TDS Sensor
- [Занимательные задачки, Программирование, C++, Алгоритмы] Обобщение классической задачи на множества с собеседований
- Группа компаний Astra Linux намерена инвестировать 3 млрд руб. в экосистему Linux
- [Информационная безопасность, DevOps] DevSecOps: организация фаззинга исходного кода
- [Python, Data Mining, Открытые данные] Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 3
- [Qt, Карьера в IT-индустрии, История IT, Биографии гиков] Как Qt сделал студента [человеком]
- Релиз программы обработки видео Cine Encoder 2020 SE 2.4
Теги для поиска: #_*nix, #_c, #_gtk3, #_linux, #_*nix, #_c
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:32
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Я вижу часто отсылки на то, как реализуется то или иное на qt, но gtk тоже хорош. Я пишу на C и не хочу учить каждые три года стандарты C++, чтобы быть на волне. Мне хватает простой сишечки и чтобы делать графический софт, выбор пал на gtk. Документацию к нему я использую в программе devhelp. Итак начнем. Первое что нужно сделать, это создать приложение, которое будет видно на dbus шине. GtkApplication *app;
static void app_activate_cb ( GtkApplication *app, gpointer user_data ) { } int main ( int argc, char **argv ) { app = gtk_application_new ( "com.xverizex.configurator", G_APPLICATION_FLAGS_NONE ); g_application_register ( ( GApplication * ) app, NULL, NULL ); g_signal_connect ( app, "activate", G_CALLBACK ( app_activate_cb ), NULL ); return g_application_run ( ( GApplication * ) app, argc, argv ); } После того, как приложение активировалось, нужно наполнить его виджетами. Я создаю в этом файле структуру, которая будет хранить все виджеты, которые будут изменяться в оформлении, если указать другую цветовую схему. вот структура. struct widgets {
GtkWidget *main_window; GtkWidget *notebook; GtkWidget *tree_view_sources; GtkWidget *label_tab_sources; GtkWidget *header_bar; GtkWidget *search_entry; GtkWidget *button_add_item; GtkWidget *tree_view_reactions; GtkWidget *label_tab_reactions; GtkWidget *window_add_source; ... GtkWidget *STUBS; в конце я создаю специальную переменную, так называемую STUBS, которой я ничего не присваиваю. В приложении виджетов очень много и нужен какой то способ присвоить нужным виджетам нужное имя. Я делаю это так. static void set_theme_name ( const char *name ) {
struct widgets **p = ( struct widgets ** ) &w; for ( int i = 0; p[i] != NULL; i++ ) { gtk_widget_set_name ( ( GtkWidget * ) p[i], name ); } char buf[255]; snprintf ( buf, 255, "%s_info", name ); gtk_widget_set_name ( w.label_info_db_settings, buf ); gtk_widget_set_name ( w.label_info_mail_settings, buf ); } тем виджетам, которым нужно ещё особенное оформление, я уже назначаю им отдельные названия. В этой функции я пробегаю по всем виджетам и указываю им имя темы. Для создания меню используюется вот такой код. static void create_actions ( void ) {
const GActionEntry entries[] = { { "quit", action_activate_quit }, { "settings", action_settings }, { "apply_settings", action_activate_apply_settings }, { "select_light_theme", action_activate_select_light_theme }, { "select_dark_theme", action_activate_select_dark_theme }, { "select_standard_theme", action_activate_select_standard_theme } }; g_action_map_add_action_entries ( G_ACTION_MAP (app), entries, G_N_ELEMENTS (entries), NULL ); } И потом назначаем эти команды в меню. pop_menu = g_menu_new ( );
GMenu *menu_app = g_menu_new ( ); GMenu *menu_themes = g_menu_new ( ); g_menu_append ( menu_app, "Настройки", "app.settings" ); g_menu_append ( menu_app, "Обновить", "app.apply_settings" ); g_menu_append ( menu_themes, "Светлая тема", "app.select_light_theme" ); g_menu_append ( menu_themes, "Темная тема", "app.select_dark_theme" ); g_menu_append ( menu_themes, "Стандартная тема", "app.select_standard_theme" ); g_menu_append_submenu ( menu_app, "Сменить тему", ( GMenuModel * ) menu_themes ); g_menu_append ( menu_app, "Выход", "app.quit" ); gtk_application_set_app_menu ( app, ( GMenuModel * ) menu_app ); В итоге пописав это приложение, оно превращается в нечто прекрасное и красивое. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:32
Часовой пояс: UTC + 5