Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
gtk_container_set_border_width(GTK_CONTAINER(toolbar), 1); gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), "gtk-add", "Add new CD", NULL, GTK_SIGNAL_FUNC(on_addcd_activate), NULL, -1); gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), 1); gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), "gtk-quit", "Quit the Application", NULL, GTK_SIGNAL_FUNC(on_quit_activate), NULL, -1);7. Затем вы создаете виджеты, используемые для поиска компакт-диска:
label = gtk_label_new("Search String:"); entry = gtk_entry_new(); search_button = gtk_button_new_with_label("Search");8. Окно
gtk_scrolled_windowGtkTreeView scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);9. Далее скомпонуйте интерфейс, применяя стандартным способом виджеты-контейнеры:
vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 6); gtk_box_pack_start(GTK_BOX(hbox), search_button, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);10. Затем создайте виджет
GtkTreeViewGtkScrolledWindow treeview = gtk_tree_view_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), COLUMN_TITLE, "Title", renderer, "text", COLUMN_TITLE, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), COLUMN_ARTIST, "Artist", renderer, "text", CQLUMN_ARTIST, NULL); gtk_tree_view_insert_column_with_attrihutes(GTK_TREE_VIEW(treeview), COLUMN_CATALOGUE, "Catalogue", renderer, "text", COLUMN_CATALOGUE, NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), COLUMN_TITLE); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);11. В заключение задайте содержимое главного окна, вставьте строку состояния
GnomeApp gnome_app_set_contents(GNOMEAPP(app), vbox); appbar = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_NEVER); gnome_app_set_statusbar(GNOME_APP(app), appbar); gnome_app_install_menu_hints(GNOME_APP(app), menubar); g_signal_connect(GTK_OBJECT(search_button), "clicked", GTK_SIGNAL_FUNC(on_search_button_clicked), entry); g_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(delete_event_handler), NULL); g_signal_connect(GTK_OBJECT(app), "destroy", GTK_SIGNAL_FUNC(quit_app), NULL); return app;}12. Следующая функция создает простое диалоговое окно, позволяющее добавлять новый компакт-диск в базу данных. Оно состоит из полей ввода для исполнителя, названия и полей каталога, а также кнопок OK и Cancel:
GtkWidget *create_addcd_dialog() { artist_entry = gtk_entry_new(); title_entry = gtk_entry_new(); catalogue_entry = gtk_entry_new(); GtkWidget* dialog = gtk_dialog_new_with_buttons("Add CD", app, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), "Artist", artist_entry); add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), "Title", title_entry); add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), "Catalogue", catalogue_entry); g_signal_connect(GTK_OBJECT(dialog), "response", GTK_SIGNAL_FUNC(addcd_dialog_button_clicked), NULL); return dialog;}13. База данных требует регистрации пользователя перед выполнением запросов к ней, поэтому данная функция создает диалоговое окно для ввода имени пользователя и пароля:
GtkWidget *create_login_dialog() { GtkWidget* dialog = gtk_dialog_new_with_buttons("Database Login", app, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); username_entry = gtk_entry_new(); password_entry = gtk_entry_new();