gtkアプリケーションの構築

これまたはそれがqtでどのように実装されているかについての言及をよく目にしますが、gtkも優れています。私はCで書いていますが、その上にあるために3年ごとにC ++標準を学びたくありません。単純なsishechkiで十分であり、グラフィックソフトウェアを作成するには、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 );


その結果、このアプリケーションをおしっこした後、それは素晴らしくて美しいものに変わります。



画像



All Articles