Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Мы опишем большинство самых полезных функций виджета GtkEntry
:
GtkWidget* gtk_entry_new(void);
GtkWidget* gtk_entry_new_with_max_length(gint max);
void gtk_entry_set_max_length(GtkEntry *entry, gint max);
G_CONST_RETURN gchar* gtk_entry_get_text(GtkEntry *entry);
void gtk_entry_set_text(GtkEntry *entry, const gchar *text);
void gtk_entry_append_text(GtkEntry *entry, const gchar *text);
void gtk_entry_prepend_text(GtkEntry* entry, const gchar *text);
void gtk_entry_set_visibility(GtkEntry *entry, gboolean visible);
void gtk_entry_set_invisible_char(GtkEntry *entry, gchar invch);
void gtk_entry_set_editable(GtkEntry *entry, gboolean editable);
Вы можете создать GtkEntry
с помощью функции gtk_entry_new
или при вводе текста фиксированной длины с помощью функции gtk_entry_new_with_max_length
. Ограничение ввода определенной длиной текста избавляет вас от проверки корректности длины ввода и, возможно, необходимости информировать пользователя о том, что текст слишком длинный.
Для получения содержимого виджета GtkEntry
вызывайте функцию gtk_entry_get_text
, которая возвращает указатель const char
, внутренний по отношению к GtkEntry
( G_CONST_RETURN
— макрос, определенный в библиотеке GLib). Если вы хотите изменить текст или передать его в функцию, которая может его модифицировать, следует скопировать строку с помощью, например, функции strcpy
.
Вы можете вручную задавать и изменять содержимое виджета GtkEntry
, применяя функции _set_text
, _append_text
и _modify_text
. Учтите, что они принимают указатели const.
Для применения GtkEntry
в качестве поля ввода пароля, которое отображает звездочки на месте символов, воспользуйтесь функцией gtk_entry_set_visibility
, передав ей параметр visible
со значением FALSE
. Скрывающий символ можно изменить в соответствии с вашими требованиями с помощью функции gtk_entry_set_invisible_char
.
Выполните упражнение 16.4.
Теперь, познакомившись с функциями виджета GtkEntry, посмотрим на них в действии в небольшой программе. Программа entry.c будет создавать окно ввода имени пользователя и пароля и сравнивать введенный пароль с секретным.
1. Сначала определим секретный пароль, остроумно заданный как secret
:
#include
#include
#include
const char * password = "secret";
2. У вас есть две функции обратного вызова, которые вызываются, когда уничтожается окно и щелкается мышью кнопка OK:
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
void button_clicked(GtkWidget *button, gpointer data) {
const char *password_text =
gtk_entry_get_text(GTK_ENTRY((GtkWidget *) data));
if (strcmp(password_text, password) == 0)
printf("Access granted!\n");
else printf("Access denied!\n");
}
3. В функции main
создается, компонуется интерфейс и связываются обратные вызовы с сигналами. Для компоновки виджетов меток и полей ввода примените виджеты-контейнеры hbox и vbox:
int main (int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *username_label, *password_label;
GtkWidget *username_entry, *password_entry;
GtkWidget *ok_button;
GtkWidget *hbox1, *hbox2;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkEntryBox");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_windowset_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);
username_label = gtk_label_new("Login:");
password_label = gtk_label_new("Password:");
username_entry = gtk_entry_new();
password_entry = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
ok_button = gtk_button_new_with_label("Ok");
g_signal_connect(GTK_OBJECT(ok_button), "clicked",
GTK_SIGNAL_FUNC(button_clicked), password_entry);
hbox1 = gtk_hbox_new(TRUE, 5);
hbox2 = gtk_hbox_new(TRUE, 5);
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), ck_button, FALSE, FALSE, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Когда вы запустите программу, то получите окно, показанное на рис. 16.8.

Рис. 16.8
Как это работает
Программа создает два виджета типа GtkEntry
, username_entry
и password_entry
, а также задает видимость password_entry
, равной FALSE
, чтобы скрыть введенный пароль. Затем она формирует кнопку GtkButton
, с помощью которой вы связываете сигнал clicked
с функцией обратного вызова button_clicked
.
Как только в функции обратного вызова программа извлечет введенный пароль и сравнит его с секретным паролем, на экран выводится соответствующее сообщение.
Обратите внимание на то, что для вставки виджетов в свои контейнеры вы много раз повторили операторы gtk_box_pack_start
. Для сокращения этого повторяющегося программного кода в последующих примерах будет определена вспомогательная функция.
GtkSpinButton
Порой вам нужно, чтобы пользователь ввел числовое значение, например, максимальную скорость или размер инструмента, и в такой ситуации виджет GtkSpinButton
(кнопка-счетчик) идеален. Он ограничивает ввод пользователя только цифровыми символами и можно задать диапазон допустимых значений от нижней до верхней границы. Виджет также содержит стрелки, направленные вверх и вниз, так что пользователь может "накручивать" значение, для удобства пользуясь только мышью.
GtkWidget
+---- GtkEntry
+---- GtkSpinButton
И снова API понятен, и мы перечислим наиболее часто применяемые вызовы:
GtkWidget* gtk_spin_button_new(GtkAdjustment *adjustment,
gdouble climb_rate, guint digits);
GtkWidget* gtk_spin_button_new_with_range(gdouble min, gdouble max,
gdouble step);
void gtk_spin_button_set_digits(GtkSpinButton *spin_button, guint digits);
void gtk_spin_button_set_increments(GtkSpinButton *spin_button,
gdouble step, gdouble page);
void gtk_spin_button_set_range(GtkSpinButton *spin_button, gdouble min,
gdouble max);
gdouble gtk_spin_button_get_value(GtkSpinButton *spin_button);
gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button);
void gtk_spin_button_set_value(GtkSpinButton *spin button, gdouble value);
Для создания виджета GtkSpinButton
с помощью функции gtk_spin_button_new
вы сначала должны создать объект GtkAdjustment
. Виджет GtkAdjustment
— это абстрактный объект, содержащий логику, касающуюся управления значениями с ограничениями. Он также применяется и в других виджетах, таких как GtkHScale
и GtkVScale
.
Для создания объекта типа GtkAdjustment
передайте в функцию нижнюю и верхнюю границы и размер приращения.
Интервал:
Закладка: