#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",
KStdAcceclass="underline" :shortcut(KStdAcceclass="underline" :New), this, SLOT(AddCd()), this);
KAction *quit_action = KStdAction::quit(KApplication::kApplication(),
SLOT(quit()), actionCollection());
QPopupMenu* filemenu = new QPopupMenu;
QString about = ("CD App\n\n"
"(C) 2007 Wrox Press\n" "email@email.com\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);