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 {