Книга: Основы программирования в Linux

MainWindow

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]");
 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.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.266. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз