Membangun aplikasi gtk

Saya sering melihat referensi tentang bagaimana hal-hal diimplementasikan di qt, tetapi gtk juga bagus. Saya menulis dalam C dan tidak ingin mempelajari standar C ++ setiap tiga tahun untuk menjadi yang teratas. Sishechki sederhana sudah cukup bagi saya dan untuk membuat perangkat lunak grafis, pilihannya jatuh pada gtk.



Saya menggunakan dokumentasi untuk itu di program devhelp. Jadi, mari kita mulai.



Hal pertama yang harus dilakukan adalah membuat aplikasi yang akan terlihat di bus 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 );
}


Setelah aplikasi diaktifkan, Anda perlu mengisinya dengan widget. Saya membuat dalam file ini sebuah struktur yang akan menyimpan semua widget yang tampilannya akan berubah jika Anda menentukan skema warna yang berbeda.



Berikut strukturnya:



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;


pada akhirnya saya membuat variabel khusus yang disebut STUBS yang tidak saya tetapkan apa pun. Ada banyak widget dalam aplikasi dan Anda memerlukan beberapa cara untuk memberikan nama yang diinginkan pada widget yang diinginkan. Beginilah cara saya melakukannya.



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 );
}


untuk widget-widget yang masih membutuhkan desain khusus, saya sudah memberikan nama yang berbeda-beda. Dalam fungsi ini, saya memeriksa semua widget dan memberinya nama tema.

Kode berikut digunakan untuk membuat menu.



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 );
}


Dan kemudian kami menetapkan perintah ini ke menu.



	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 );


Alhasil, setelah mengencingi aplikasi ini, ternyata menjadi sesuatu yang indah dan indah.



gambar



All Articles