Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 194

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

β–‘ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° 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 App\n\n"

  "(C) 2007 Wrox Press\n" " [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");