Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
statusBar()->message("");
setCentralWidget(vbox);
resize(300, 400);
}
6. Слот doSearch
— рабочее завершение приложения. В нем считывается строка поиска и выбираются все соответствующие ей компакт-диски и их дорожки. Логика слота такая же, как в функции doSearch
GNOME/GTK+ в главе 16.
void MainWindow::doSearch() {
cd_search_st *cd_res = new cd_search_st;
current_cd_st *cd = new current_cd_st;
struct current_tracks_st ct;
int res1, i, j, res2, res3;
char track_title[110];
char search_text[100];
char statusBar_text[200];
QListViewItem *cd_item;
strcpy(search_text, search_entry->text());
7. Извлеките id
соответствующих компакт-дисков и обновите строку состояния, чтобы отобразить результаты поиска:
res1 = find_cds(search_text, cd_res);
sprintf(statusBar_text,
" Displaying %d result(s) for search string ' %s'",
res1, search_text);
statusBar()->message(statusBar_text);
i = 0;
list->clear();
8. Для каждого id
извлеките сведения о компакт-диске в виджет QListView
и информацию обо всех дорожках данного CD:
while (i < res1) {
res2 = get_cd(cd_res->cd_id[i], cd);
cd_item = new QListViewItem(list, cd->title, cd->artist_name,
cd->catalogue);
res3 = get_cd_tracks(cd_res->cd_id[i++], &ct);
j = 0;
/* Заполните дерево дорожками текущего компакт-диска */
while (j < res3) {
sprintf(track_title, " Track %d. ", j+1);
strcat(track_title, ct.track[j++]);
new QListViewItem(cd_item, track_title);
}
}
}

Рис. 17.13
9. Слот AddCd
вызывается, когда активизирован пункт меню или кнопка панели инструментов addcd_action
:
void MainWindow::AddCd()
AddCdDialog* dialog = new AddCdDialog(this);
dialog->show();
}
Результат показан на рис. 17.13.
AddCdDialog
Для вставки сведений о компакт-диске в базу данных вам нужно включить в программу диалоговое окно с полями, необходимыми для ввода информации.
1. Введите следующий программный код в файл AddCdDialog.h. Имейте в виду, что класс AddCdDialog
— потомок KDialogBase
, виджета диалогового окна в среде KDE.
#include
#include
class AddCdDialog : public KDialogBase {
Q_OBJECT
public:
AddCdDialog(QWidget* parent);
private:
QLineEdit* artist_entry, *title_entry, *catalogue_entry;
public slots:
void okClicked();
};
2. Далее следует файл AddCdDialog.cpp, в котором в слоте okClicked
вызывается функция add_cd
из интерфейса MySQL:
#include "AddCdDialog.h"
#include "app_mysql.h"
#include
#include
AddCdDialog::AddCdDialog(QWidget* parent)
: KDialogBase(parent, "AddCD", false, "Add CD",
KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, true) {
QWidget *widget = new QWidget(this);
setMainWidget(widget);
QGridLayout *grid = new QGridLayout(widget, 3, 2, 10, 5, "grid");
grid->addWidget(new QLabel("Artist", widget, "artistlabel"), 0, 0, 0);
grid->addWidget(new QLabel("Title", widget, "titlelabel"), 1, 0, 0);
grid->addwidget(new QLabel("Catalogue", widget, "cataloguelabel"), 2, 0, 0);
artist_entry = new QLineEdit(widget, "artist_entry");
title_entry = new QLineEdit(widget, "titleentry");
catalogue_entry = new QLineEdit(widget, "catalogue_entry");
grid->addWidget(artist_entry, 0, 1, 0);
grid->addWidget(title_entry, 1, 1, 0);
grid->addWidget(catalogue_entry, 2, 1, 0);
connect(this, SIGNAL(okClicked()), this, SLOT(okClicked()));
}
void AddCdDialog::okClicked() {
char artist[200];
char title[200];
char catalogue[200];
int cd_id = 0;
strcpy(artist, artist_entry->text());
strcpy(title, title_entry->text());
strcpy(catalogue, catalogue_entry->text());
add_cd(artist, title, catalogue, &cd_id);
}
На рис. 17.14 показано работающее диалоговое окно AddCdDialog
.

Рис. 17.14
LogonDialog
Вы, конечно же, не сможете запрашивать базу данных без предварительной регистрации, поэтому вам необходимо простое диалоговое окно для ввода имени пользователя и пароля. Назовите этот класс LogonDialog
. (Да, еще один пример остроумного и образного имени!)
1. Начнем с заголовочного файла. Введите приведенный далее программный код и назовите файл LogonDialog.h. Обратите внимание на то, что для разнообразия этот класс описан в данном случае как потомок класса QDialog
, а не KDialogBase
.
#include
#include
class LogonDialog : public QDialog {
Q_OBJECT
public:
LogonDialog(QWidget* parent = 0, const char *name = 0);
QString getUsername();
QString getPassword();
private:
QLineEdit *username_entry, *password_entry;
};
2. У вас есть более удобные методы для имени пользователя и пароля, чем инкапсуляция в файле LogonDialog.cpp вызова database_start
. Далее приведен файл LogonDialog.cpp:
#include "LogonDialog.h"
#include "appmysql.h"
#include
#include
#include
LogonDialog::LogonDialog(QWidget *parent, const char *name):
QDialog(parent, name) {
QGridLayout *grid = new QGridLayout(this, 3, 2, 10, 5, "grid");
grid->addWidget(new QLabel("Username", this, "usernamelabel"), 0, 0, 0);
grid->addWidget(new QLabel("Password", this, "passwordlabel"), 1, 0, 0);
username_entry = new QLineEdit(this, "username entry");
password_entry = new QLineEdit(this, "password_entry");
password_entry->setEchoMode(QLineEdit::Password);
grid->addWidget(username_entry, 0, 1, 0);
grid->addWidget(passwordentry, 1, 1, 0);
QPushButton* button = new QPushButton("Ok", this, "button");
grid->addWidget(button, 2, 1, Qt::AlignRight);
connect (button, SIGNAL(clicked()), this, SLOT(accept()));
}
QString LogonDialog::getUsername() {
if (username_entry == NULL) return NULL;
return username_entry->text();
}
QString LogonDialog::getPassword() {
if (password_entry == NULL) return NULL;
return password_entry->text();
}
На рис. 17.15 показано, как будет выглядеть диалоговое окно.

Рис. 17.15
main.cpp
Единственный оставшийся программный код — функция main
, которую вы помещаете в отдельный файл main.cpp.
1. В файле main.cpp вы открываете окно LogonDialog
и получаете успешную регистрацию из функции database_start
. Если регистрация оказалась неудачной, вы выводите окно QMessageBox
или при попытке закрыть LogonDialog
просите у пользователя подтверждения его выхода.
#include "MainWindow.h"
#include "app_mysql.h"
#include "LogonDialog.h"
#include
#include
int main(int argc, char **argv) {
char username[100];
char password[100];
KApplication a(argc, argv, "cdapp");
LogonDialog *dialog = new LogonDialog();
while (1) {
if (dialog->exec() == QDialog::Accepted) {
strcpy(username, dialog->getUsername());
strcpy(password, dialog->getPassword());
if (database_start(username, password)) break;
QMessageBox::information(0, "Title",
"Could not Logon: Check username and/or password",
QMessageBox::Ok);
continue;
} else {
if (QMessageBox:information(0, "Title",
"Are you sure you want to quit?", QMessageBox::Yes,
QMessageBox::No) == QMessageBox::Yes) {
Интервал:
Закладка: