Читаем Основы программирования в Linux полностью

 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 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


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже