Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
gtk_tree_store_append(store, &child, &iter);
Дополнительную информацию об объектах GtkTreeStore
и функциях объекта GtkListStore
см. в документации API, а мы пойдем дальше и рассмотрим компонент Представление типа GtkTreeView
.
Создание объекта GtkTreeView
— сама простота: только передайте в конструктор в качестве параметра модель типа GtkTreeStore
или GtkListStore
:
GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
Сейчас самое время настроить виджет для отображения данных именно так, как вы хотите. Для каждого столбца следует определить GtkCellRenderer
и источник данных. Можно выбрать, например, визуализацию только определенных столбцов данных или изменить порядок вывода столбцов.
GtkCellRenderer
— это объект, отвечающий за прорисовку каждой ячейки на экране, и существует три подкласса, имеющие дело с текстовыми ячейками, ячейками пиксельной графики и ячейками кнопок-выключателей:
□ GtkCellRendererText
;
□ GtkCellRendererPixBuf
;
□ GtkCellRendererToggle
.
В вашем Представлении будет применено текстовое представление ячеек, GtkCellRendererText
.
GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
"This is the column title", renderer, "text", 0, NULL);
Вы создаете представление ячейки и передаете его в функцию вставки столбца. Эта функция позволяет сразу задать свойства GtkCellRendererText
, передавая заканчивающиеся значением NULL
пары "ключ/значение". В качестве параметров указаны представление дерева, номер столбца, заголовок столбца, представление ячейки и его свойства. В приведенном примере вы задаете атрибут "text", передав номер столбца источника данных. Для объекта GtkCellRendererText
определено несколько других атрибутов, включая подчеркивание, шрифт, размер и т.д.
В упражнении 16.7, выполнив необходимые шаги, вы увидите, как это работает на практике.
GtkTreeView
Введите следующий программный код и назовите файл tree.с.
1. Примените тип enum
для обозначения столбцов, чтобы можно было ссылаться на них по именам. Общее количество столбцов удобно обозначить как N_COLUMNS
:
#include
enum {
COLUMN_TITLE, COLUMN_ARTIST, COLUMN_CATALOGUE, N_COLUMNS
};
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkTreeStore *store;
GtkWidget *view;
GtkTreeIter parent_iter, child_iter;
GtkCellRenderer *renderer;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(сloseApp), NULL);
2. Далее вы создаете модель дерева, передавая количество столбцов и тип каждого из них:
store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING);
3. Следующий этап — вставка родительской и дочерней строк в дерево:
gtk_tree_store_append(store, &parent_iter, NULL);
gtk_tree_store_set(store, &parent_iter,
COLUMN_TITLE, "Dark Side of the Moon",
COLUMN_ARTIST, "Pink Floyd",
COLUMN_CATALOGUE, "B000024D4P", -1);
gtk_tree_store_append(store, &child_iter, &parent_iter);
gtk_tree_store_set (store, &child_iter,
COLUMN_TITLE, "Speak to Me", -1);
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
4. Наконец, добавьте столбцы в представление, задавая источники данных для них и заголовки:
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_TITLE, "Title", renderer, "text",
COLUMN_TITLE, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_ARTIST, "Artist", renderer, "text",
COLUMN_ARTIST, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_CATALOGUE, "Catalogue", renderer, "text",
COLUMN_CATALOGUE, NULL);
gtk_container_add(GTK_CONTAINER(window), view);
gtk_widget_show_all(window); gtk_main();
return 0;
}
Вы будете применять GtkTreeView
как основной объект вашего приложения для работы с компакт-дисками, когда будете модифицировать содержимое GtkTreeView
в соответствии с запросами к базе данных компакт-дисков.
Мы завершили обзор виджетов GTK+ и теперь обратим наше внимание на другую половину: среду GNOME. Вы увидите, как вставлять меню в ваше приложение с помощью библиотек GNOME и как виджеты GNOME облегчают программирование для рабочего стола GNOME.
Виджеты GNOME
Комплект GTK+ спроектирован как нейтральный по отношению к рабочему столу, т.е. GTK+ не делает никаких допущений о том, что он выполняется в среде GNOME или даже в системе Linux. Причина заключается в том, что комплект инструментов GTK+ можно с относительной легкостью перенести для выполнения в ОС Windows или любой другой оконной системе. В результате GTK+ не хватает средств для связывания программы с рабочим столом, таких как средства сохранения настройки программы, отображение файлов помощи или программные апплеты (апплеты — это небольшие утилиты, выполняющиеся на краевых панелях (edge panels)).
Библиотеки среды включают виджеты GNOME, расширяющие комплект GTK+ и замещающие его части более легкими в применении виджетами. В этом разделе мы расскажем, как программировать с помощью виджетов GNOME.
Перед использованием библиотек GNOME их следует инициализировать при запуске ваших программ точно так же, как вы поступали с библиотеками GTK+. Вы вызываете функцию gnome_program_init
также, как вы вызывали функцию gtk_init
в чистых программах GTK+.
Эта функция принимает параметры app_id
и арр_version
, применяемые для описания вашей программы в среде GNOME, module_info
, сообщающий GNOME о том, какой библиотечный модуль инициализировать, параметры командной строки и свойства приложения, заданные как NULL-терминированный список пар "имя/значение".
GnomeProgram* gnome_program_init(const char *app_id,
const char *app_version, const GnomeModuleInfо *module_infо,
int argc, char **argv, const char *first_property_name, ...);
Необязательный список свойств позволяет задать такие характеристики, как, например, каталог для поиска растровой графики.
Выполните упражнение 16.8.
Давайте рассмотрим программу, применяющую средства GNOME, в которой выполняется GNOME-замещение объекта GtkWindow
виджетом GnomeApp
.
Введите эту программу и назовите ее gnome1.c:
#include
int main(int argc, char* argv[]) {
GtkWidget *app;
gnome_program_init("gnome1", "1.0", MODULE, argc, argv, NULL);
app = gnome_app_new("gnome1", "The Window Title");
gtk_widget_show(app);
gtk_main();
return 0;
}
Для компиляции вам необходимо включить заголовочные файлы GNOME, поэтому передайте библиотеки libgnomeui и libgnome в команду pkg-config
:
$ gcc gnome1.с -о gnome1 `pkg-config --cflags --libs libgnome-2.0 libgnomeui-2.0`
Виджет GnomeApp
расширяет возможности GtkWindow и облегчает вставку меню, панелей инструментов и строки состояния вдоль нижнего края окна. Поскольку он потомок GtkWindow
, вы можете применять к виджету GnomeApp
любую функцию виджета GtkWindow
. Далее вы познакомитесь с созданием меню и добавите строку состояния в ваш финальный пример.
Интервал:
Закладка: