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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 6

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Рис. 2.1. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ поиска.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ содСрТится Π² Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»Π°Ρ…: finddialog.h ΠΈ finddialog.cpp. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„Π°ΠΉΠ» finddialog.h:

01 #ifndef FINDDIALOG_H

02 #define FINDDIALOG_H

03 #include <QDialog.h>

04 class QCheckBox;

05 class QLabel;

06 class QLineEdit;

07 class QPushButton;

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 1 ΠΈ 2 (Π° Ρ‚Π°ΠΊΠΆΠ΅ строка 27) ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ этого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π’ строкС 3 Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ QDialog β€” Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ Π² Qt. Класс QDialog наслСдуСт свойства класса QWidget.

Π’ строках с 4 ΠΏΠΎ 7 Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния классов Qt, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС (forward declaration) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ компилятору Π‘++ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сущСствованиС класса, Π½Π΅ давая ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ опрСдСлСния этого класса (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса содСрТится Π² Π΅Π³ΠΎ собствСнном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅). Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ опрСдСляСм FindDialog ΠΊΠ°ΠΊ подкласс QDialog:

08 class FindDialog : public QDialog

09 {

10 Q_OBJECT

11 public:

12 FindDialog(QWidget *parent = 0);

ΠœΠ°ΠΊΡ€ΠΎΡ Q_OBJECT Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ опрСдСлСния любого класса, содСрТащСго сигналы ΠΈΠ»ΠΈ слоты.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ FindDialog являСтся Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌ для классов Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² Qt. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ parent (Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ) указываСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ задаСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π½Π΅Ρ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

13 signals:

14 void findNext(const QString &str, Qt::CaseSensitivity cs);

15 void findPrev(const QString &str, Qt::CaseSensitivity cs);

Π’ сСкции signals ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π΄Π²Π° сигнала, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Find (Π½Π°ΠΉΡ‚ΠΈ). Если установлСн Ρ„Π»Π°ΠΆΠΎΠΊ поиска Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ (Search backward), гСнСрируСтся сигнал findPrevious(); Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС гСнСрируСтся сигнал findNext ().

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово signals Π½Π° самом Π΄Π΅Π»Π΅ являСтся макросом. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π‘++ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² стандартныС инструкции языка Π‘++ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡ… компилятору. Qt::CaseSensitivity являСтся пСрСчислСниСм ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Qt::CaseSensitive ΠΈΠ»ΠΈ Qt::CaseInsensitive.

16 private slots:

17 void findClicked();

18 void enableFindButton(const QString &text);

19 private:

20 QLabel *label;

21 QLineEdit *lineEdit;

22 QCheckBox *caseCheckBox;

23 QCheckBox *backwardCheckBox;

24 QPushButton *findButton;

25 QPushButton *closeButton;

26 };

27 #endif

Π’ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ (private) сСкции класса ΠΌΡ‹ объявляСм Π΄Π²Π° слота. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слотов Π½Π°ΠΌ потрСбуСтся Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, поэтому ΠΌΡ‹ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌ для Π½ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅β€”ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово slots, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ signals, являСтся макросом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСобразуСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ инструкций, понятных компилятору Π‘++.

Для Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΡ‹ использовали ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния ΠΈΡ… классов. Π­Ρ‚ΠΎ допустимо, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ указатСлями, ΠΈ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΡ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ β€” поэтому компилятору Π½Π΅ трСбуСтся ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Π΅ опрСдСлСния классов. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (<QCheckbox>, <QLabel> ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅), Π½ΠΎ ΠΏΡ€ΠΈ использовании ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объявлСний компилятор Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ„Π°ΠΉΠ» finddialog.cpp, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится рСализация класса FindDialog.

01 #include <QtGui>

02 #include "finddialog.h"

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ <QtGui> β€” Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит опрСдСлСния классов графичСского интСрфСйса Qt. Qt состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находится Π² своСй собствСнной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ модулями ΡΠ²Π»ΡΡŽΡ‚ΡΡ QtCore, QtGui, QtNetwork, QtOpenGL, QtSql, QtSvg ΠΈ QtXml. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <QtGui> содСрТит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ всСх классов, входящих Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ QtCore ΠΈ QtGui. Π’ΠΊΠ»ΡŽΡ‡ΠΈΠ² этот Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ класса.

Π’ filedialog.h вмСсто Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ <QDialog> ΠΈ использования ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объявлСний для классов QCheckBox, QLabel, QLineEdit ΠΈ QPushButton ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ <QtGui>. Однако Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ большого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, взятого ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠΌ стилС кодирования, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

03 FindDialog::FindDialog(QWidget *parent)

04 : QDialog(parent)

05 {

06 label = new QLabel(tr("Find &what:"));

07 lineEdit = new QLineEdit;

08 label->setBuddy(lineEdit);

09 caseCheckBox = new QCheckBox(tr("Match &case"));

10 backwardCheckBox = new QCheckBox(tr("Search backward"));

11 findButton = new QPushButton(tr("&Find"));

12 findButton->setDefault(true);

13 findButton->setEnabled(false);

14 closeButton = new QPushButton(tr("Close"));

Π’ строкС 4 конструктору Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ parent). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹. Ѐункция tr() ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки. Она ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² классС QObject ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ подклассС, содСрТащСм макрос Q_OBJECT. Π›ΡŽΠ±ΠΎΠ΅ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° экранС, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ tr(), Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Qt Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки рассматриваСтся Π² Π³Π»Π°Π²Π΅ 17.

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π·Π½Π°ΠΊ ампСрсанда ('&') для задания клавиш быстрого доступа. НапримСр, Π² строкС 11 создаСтся ΠΊΠ½ΠΎΠΏΠΊΠ° Find, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ сочСтания клавиш Alt+F Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… клавиши быстрого доступа. АмпСрсанды ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для управлСния фокусом: Π² строкС 6 ΠΌΡ‹ создаСм Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ с клавишСй быстрого доступа (Alt+W), Π° Π² строкС 8 ΠΌΡ‹ устанавливаСм строку рСдактирования Π² качСствС Β«ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π°Β» этой тСкстовой ΠΌΠ΅Ρ‚ΠΊΠΈ. ΠŸΠ°Ρ€Ρ‚Π½Π΅Ρ€ΠΎΠΌ (buddy) называСтся Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся фокус ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши быстрого доступа тСкстовой ΠΌΠ΅Ρ‚ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ сочСтания клавиш Alt+W (клавиша быстрого доступа тСкстовой ΠΌΠ΅Ρ‚ΠΊΠΈ) фокус ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° строку рСдактирования (которая являСтся ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ΠΎΠΌ тСкстовой ΠΌΠ΅Ρ‚ΠΊΠΈ).

Π’ строкС 12 ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ Find ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setDefault(true)[3]. Кнопка, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ использования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ клавиши Enter (Π²Π²ΠΎΠ΄). Π’ строкС 13 ΠΌΡ‹ устанавливаСм ΠΊΠ½ΠΎΠΏΠΊΡƒ Find Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. Π’ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ сСрый Ρ†Π²Π΅Ρ‚ ΠΈ Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

15 connect(lineEdit, SIGNAL(textChanged(const QString &)),

16 this, SLOT(enableFindButton(const QString &)));

17 connect(findButton, SIGNAL(clicked()),

18 this, SLOT(findClicked()));

19 connect(closeButton, SIGNAL(clicked()),

20 this, SLOT(close()));

Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ слот enableFindButton(const QString &) вызываСтся ΠΏΡ€ΠΈ всяком ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния Π² строкС рСдактирования. Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ слот findClicked() вызываСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Find. Π‘Π°ΠΌΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ закрываСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Close (Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ). Π‘Π»ΠΎΡ‚ close() наслСдуСтся ΠΎΡ‚ класса QWidget, ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ (Π½ΠΎ Π½Π΅ удаляСт Π΅Π³ΠΎ). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ слотов enableFindButton() ΠΈ findClicked() ΠΌΡ‹ рассмотрим ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ QObject являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΡ€Π°Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ FindDialog, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ прСфикс QObject:: ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ connect().

21 QHBoxLayout *topLeftLayout = new QHBoxLayout;

22 topLeftLayout->addWidget(label);

23 topLeftLayout->addWidget(lineEdit);

24 QVBoxLayout *leftLayout = new QVBoxLayout;

25 leftLayout->addLayout(topLeftLayout);

26 leftLayout->addWidget(caseCheckBox);

27 leftLayout->addWidget(backwardCheckBox);

28 QVBoxLayout *rightLayout = new QVBoxLayout;

29 rightLayout->addWidget(findButton);

30 rightLayout->addWidget(closeButton);

31 rightLayout->addStretch();

32 QHBoxLayout *mainLayout = new QHBoxLayout;

33 mainLayout->addLayout(leftLayout);

34 mainLayout->addLayout(rightLayout);

35 setLayout(mainLayout);

Π—Π°Ρ‚Π΅ΠΌ для размСщСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² ΠΎΠΊΠ½Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ (layout managers). ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Ρ‚Π°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ QHBoxLayout, QVBoxLayout ΠΈ QGridLayout, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ слоТныС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°.

Рис. 2.2. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° поиска Π΄Π°Π½Π½Ρ‹Ρ….