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

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

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

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ воздСйствия Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² установкС минимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ эти ограничСния ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Но Ссли этого нСдостаточно, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ всСгда ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подкласс Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sizeHint() для получСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π°ΠΌ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

БтСковая ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ°

Класс QStackedLayout (ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ стСковой ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ) управляСт ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ «страниц», показывая Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΈΡ… ΠΈ скрывая ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π‘Π°ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ QStackedLayout Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ ΠΈ Π½Π΅ содСрТит Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя срСдства для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ измСнСнию страницы. ΠŸΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π° рис. 6.5 нСбольшиС стрСлки ΠΈ тСмно—сСрая Ρ€Π°ΠΌΠΊΠ° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Qt Designer, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹. Для удобства Π² Qt прСдусмотрСн класс QStackedWidget, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой QWidget со встроСнным QStackedLayout.

Рис. 6.5. QStackedLayout.

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ с 0. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setCurrentIndex(), задавая Π½ΠΎΠΌΠ΅Ρ€ страницы. НомСр страницы Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ indexOf().

Рис. 6.6. Π”Π²Π΅ страницы Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Preferences.

ПоказанноС Π½Π° рис. 6.6 Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Preferences (настройка ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ) прСдставляСт собой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования QStackedLayout. Окно Π΄ΠΈΠ°Π»ΠΎΠ³Π° состоит ΠΈΠ· Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° QListWidget слСва ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° стСковой ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ QStackedLayout справа. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² спискС QListWidget соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ страницС QStackedLayout. НиТС приводится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ конструктора этого Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°:

01 PreferenceDialog::PreferenceDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 listWidget = new QListWidget;

05 listWidget->addItem(tr("Web Browser"));

06 listWidget->addItem(tr("Mail & News"));

07 listWidget->addItem(tr("Advanced"));

08 listWidget->addItem(tr("Appearance"));


09 stackedLayout = new QStackedLayout;

10 stacked Layout->addWidget(appearancePage);

11 stackedLayout->addWidget(webBrowserPage);

12 stackedLayout->addWidget(mailAndNewsPage);

13 stackedLayout->addWidget(advancedPage);


14 connect(listWidget, SIGNAL(currentRowChanged(int)).

15 stackedLayout, SLOT(setCurrentIndex(int)));

16 listWidget->setCurrentRow(0);

17 }

ΠœΡ‹ создаСм QListWidget ΠΈ заполняСм Π΅Π³ΠΎ названиями страниц. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм QStackedLayout ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ addWidget(). ΠœΡ‹ связываСм сигнал спискового Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° currentRowChanged(int) с setCurrentIndex(int) ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° стСковой ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ страниц ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ спискового Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° setCurrentRow() Π² ΠΊΠΎΠ½Ρ†Π΅ конструктора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ со страницы 0.

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Qt Designer.

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ Π½Π° основС шаблона Β«DialogΒ» ΠΈΠ»ΠΈ Β«WidgetΒ».

2. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„ΠΎΡ€ΠΌΡƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ QListWidget ΠΈ QStackedWidget.

3. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ страницу Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. (Для создания Π½ΠΎΠ²ΠΎΠΉ страницы Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ мСню Insert Page (Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ страницу); для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° с ΠΎΠ΄Π½ΠΎΠΉ страницы Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ малСнькой Π»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ стрСлкС, располоТСнной Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° QStackedWidget.)

4. РасполоТитС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ рядом, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.

5. ΠŸΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ сигнал Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° списка элСмСнтов currentRowChanged(int) ΠΊ слоту стСкового Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° setCurrentIndex(int).

6. УстановитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° списка элСмСнтов currentRow Π½Π° 0.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… сигналов ΠΈ слотов, Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ просмотрС Π² Qt Designer.

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ QSplitter прСдставляСт собой Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π² Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ линиями. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² раздСлитСля посрСдством пСрСмСщСния Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, прСдоставляя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ большС возмоТностСй ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ.

Рис. 6.7. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Splitter.

Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ QSplitter автоматичСски Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ рядом (ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ) Π² порядкС ΠΈΡ… создания, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ. НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для создания прСдставлСнного Π½Π° рис. 6.7 ΠΎΠΊΠ½Π°:

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 QTextEdit *editor1 = new QTextEdit;

05 QTextEdit *editor2 = new QTextEdit;

06 QTextEdit *editor3 = new QTextEdit;

07 QSplitter splitter(Qt::Horizontal);

08 splitter.addWidget(editor1);

09 splitter.addWidget(editor2);

10 splitter.addWidget(editor3);

11 splitter.show();

12 return app.exec();

13 }

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ рСдактирования QTextEdit, располоТСнных Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ QSplitter. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π° сами Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ прСдставлСния, QSplitter наслСдуСт QWidget ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.

Рис. 6.8. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ прилоТСния Splitter.

МоТно ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ ΠΏΡƒΡ‚Π΅ΠΌ примСнСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ QSplitter. НапримСр, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° рис. 6.9 ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Mail Client (ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚) состоит ΠΈΠ· Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ QSplitter, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит справа ΠΎΡ‚ сСбя Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ QSplitter.

Рис. 6.9. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Mail Client Π² систСмС Mac OS X.

НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ конструктора подкласса QMainWindow прилоТСния Mail Client:

01 MailClient::MailClient()

02 {

03 …

04 rightSplitter = new QSplitter(Qt::Vertical);

05 rightSplitter->addWidget(messagesTreeWidget);

06 rightSplitter->addWidget(textEdit);

07 rightSplitter->setStretchFactor(1, 1);

08 mainSplitter = new QSplitter(Qt::Horizontal);

09 mainSplitter->addWidget(foldersTreeWidget);

10 mainSplitter->addWidget(rigntSplitter);

11 mainSplitter->setStretchFactor(1, 1);

12 setCentralWidget(mainSplitter);

13 setWindowTitle(tr("Mail Client"));

14 readSettings();

15 }

ПослС создания Ρ‚Ρ€Π΅Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ собираСмся Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° экран, ΠΌΡ‹ создаСм Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ rightSplitter ΠΈ добавляСм Π΄Π²Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ собираСмся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ справа. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ mainSplitter ΠΈ добавляСм Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ слСва, ΠΈ rightSplitter, Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ справа. ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ mainSplitter Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ QMainWindow.

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ измСняСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π°, QSplitter ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ распрСдСляСт пространство Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прилоТСния Mail Client Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹; вмСсто этого ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ QTreeWidget ΠΈ QTableWidget сохраняли свои Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ любоС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство полю рСдактирования QTextEdit. Π­Ρ‚ΠΎ достигаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΡƒΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setStretchFactor(). Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ задаСтся индСкс Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° раздСлитСля (индСксация начинаСтся с нуля), Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ β€” коэффициСнт растяТСния; ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 0.

Рис.6.10. Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ раздСлитСля Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Mail Client.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² setStretchFactor() Π΄Π΅Π»Π°Π΅ΠΌ для rightSplitter, устанавливая Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ 1 (textEdit) ΠΈ коэффициСнт растяТСния Π½Π° 1. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² setStretcnFactor() Π΄Π΅Π»Π°Π΅ΠΌ для mainSplitter, устанавливая Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ 1 (rightSplitter) ΠΈ коэффициСнт растяТСния Π½Π° 1. Π­Ρ‚ΠΎ обСспСчиваСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ всСго Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ пространства ΠΏΠΎΠ»Π΅ΠΌ рСдактирования textEdit.

ΠŸΡ€ΠΈ запускС прилоТСния Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ QSplitter Π·Π°Π΄Π°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π½Π° основС ΠΈΡ… ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (ΠΈΠ»ΠΈ Π½Π° основС ΠΈΡ… идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ссли Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ, Π²Ρ‹Π·Ρ‹Π²aя Ρ„yΠ½ΠΊΡ†ΠΈΡŽ QSplitter::setSizes(). Класс QSplitter прСдоставляСт Ρ‚Π°ΠΊΠΆΠ΅ срСдство сохранСния своСго состояния ΠΈ Π΅Π³ΠΎ восстановлСния ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запускС прилоТСния. НиТС приводится функция writeSettings(), которая сохраняСт настройки Mail Client: