- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
□ отображение окна About (О программе).
MainWindow
Начнем обсуждение с программного кода для главного окна приложения, которое содержит виджет поля поиска и список для отображения результатов поиска.
1. Начните с ввода программного кода в файл MainWindow.h (или загрузите его с Web-сайта книги). Поскольку окно содержит виджет QLineEdit для поиска компакт-дисков и виджет QListView для вывода результатов поиска, вы должны вставить в программный код заголовочные файлы qlistview.h и qlineedit.h:
#include <kde/kmainwindow.h>
#include <qlistview.h>
#include <qlineedit.h>
class MainWindow : public KMainWindow {
Q_OBJECT
public:
MainWindow(const char *name);
public slots:
void doSearch();
void Added();
private:
QListView *list;
QLineEdit *search_entry;
};
2. MainWindow.срр — самая сложная часть программы. В конструкторе вы создаете интерфейс главного окна и связываете необходимые сигналы с вашими слотами. Как обычно, начните программу с файлов в директивах #include:
#include "MainWindow.h"
#include "AddCdDialog.h"
#include "app_mysql.h"
#include <qvbox.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qlabel.h>
#include <qlistview.h>
#include <kde/kapp.h>
#include <kde/kmenubar.h>
#include <kde/klocale.h>
#include <kde/kpopupmenu.h>
#include <kde/kstatusbar.h>
#include <kde/kaction.h>
#include <kde/kstdaccel.h>
#include <string.h>
MainWindow::MainWindow(const char * name) : KMainWindow(0L, name) {
setCaption("CD Database");
3. Теперь создайте элементы меню и панели инструментов с помощью виджета KAction.
KAction *addcd_action = new KAction("&Add CD", "filenew",
KStdAccel::shortcut(KStdAccel::New), this, SLOT(AddCd()), this);
KAction *quit_action = KStdAction::quit(KApplication::kApplication(),
SLOT(quit()), actionCollection());
QPopupMenu* filemenu = new QPopupMenu;
QString about = ("CD Appnn"
"(C) 2007 Wrox Pressn" "[email protected]n");
QPopupMenu* helpmenu = helpMenu(about);
menuBar()->insertItem("&File", filemenu);
menuBar()->insertltem(i18n("&Help"), helpmenu);
addcd_action->plug(filemenu);
filemenu->insertSeparator();
quit_action->plug(filemenu);
addcd_action->plug(toolBar());
quit_action->plug(toolBar());
4. Для разнообразия примените виджеты QBoxLayout вместо обычных классов QLayout:
QVBox *vbox = new QVBox(this);
QHBox *hbox = new QHBox(vbox);
QLabel* label = new QLabel(hbox);
label->setText("Search Text: ");
search_entry = new QLineEdit(hbox);
QPushButton *button = new QPushButton("Search", hbox);
5. Далее следует виджет QListView, занимающий основную часть рабочей области окна. После этого для поиска компакт-диска в базе данных вы связываете необходимые сигналы с вашим слотом doSearch. Строка состояния KMainWindow становится видимой за счет вставки пустого сообщения:
list = new QListView(vbox, "name", 0L);
list->setRootIsDecorated(TRUE);
list->addColumn("Title");
list->addColumn("Artist");
list->addColumn("Catalogue");
connect(button, SIGNAL(clicked()), this, SLOT(doSearch()));
connect(search_entry, SIGNAL(returnPressed()), this, SLOT(doSearch()));
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 <kde/kdialogbase.h>
#include <qlineedit.h>
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 <qlayout.h>
#include <qlabel.h>
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 <qdialog.h>
#include <qlineedit.h>
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 <qpushbutton.h>
#include <qlayout.h>
#include <qlabel.h>
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");

