Чтение онлайн

на главную

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

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:

01 void MailClient::writeSettings

02 {

03 QSettings settings("Software Inc.", "Mail Client");

04 settings.beginGroup("mainWindow");

05 settings.setValue("size", size);

06 settings.setValue("mainSplitter", mainSplitter->saveState);

07 settings.setValue("rightSplitter", rightSplitter->saveState);

08 settings.endGroup;

09 }

Ниже приводится соответствующая функция по чтению настроек readSettings:

01 void MailClient::readSettings

02 {

03 QSettings settings("Software Inc.", "Mail Client");

04 settings.beginGroup("mainWindow");

05 resize(settings.value("size", QSize(480, 360)).toSize);

06 mainSplitter->restoreState(

07 settings.value("mainSplitter").toByteArray);

08 rightSplitter->restoreState(

09 settings.value("rightSplitter").toByteArray);

10 settings.endGroup;

11 }

Разделитель QSplitter полностью поддерживается Qt Designer. Для размещения виджетов в разделителе поместите дочерние виджеты приблизительно в то место, где они должны находиться, выделите их и выберите пункт меню Form | Lay Out Horizontally in Splitter или Form | Lay Out Vertically in Splitter (Форма | Компоновка no roризонтали в разделитель или Форма | Компоновка по вертикали в разделитель).

Области с прокруткой

Класс QScrollArea содержит область отображения, которую можно прокручивать, и две полосы прокрутки. Если мы хотим добавить в виджет полосы прокрутки, значительно проще использовать класс QScrollArea, чем создавать свои собственные экземпляры QScrollBar и самим реализовывать функциональность скроллинга.

Рис. 6.11. Виджеты, составляющие область с прокруткой QScrollArea.

Способ применения QScrollArea состоит в следующем: вызывается функция setWidget с виджетом, к которому мы хотим добавить полосы прокрутки. QScrollArea автоматически делает этот виджет дочерним (если он еще не является таковым) по отношению к области отображения (он доступен при помощи функции QScrollArea::viewport). Например, если мы хотим иметь полосы прокрутки вокруг виджета IconEditor, который мы разработали в главе 5 , мы можем написать такую программу:

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

02 {

03 QApplication app(argc, argv);

04 IconEditor *iconEditor = new IconEditor;

05 iconEditor->setIconImage(QImage(":/images/mouse.png"));

06 QScrollArea scrollArea;

07 scrollArea.setWidget(iconEditor);

08 scrollArea.viewport->setBackgroundRole(QPalette::Dark);

09 scrollArea.viewport->setAutoFillBackground(true);

Поделиться:
Популярные книги

Печать Пожирателя

Соломенный Илья
4. Пожиратель
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя

Локки 6. Потомок бога

Решетов Евгений Валерьевич
6. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 6. Потомок бога

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Слезы Эйдена 1

Владимиров Денис
11. Глэрд
Фантастика:
боевая фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Слезы Эйдена 1

Кодекс Охотника. Книга IX

Винокуров Юрий
9. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга IX

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Я до сих пор князь. Книга XXII

Дрейк Сириус
22. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор князь. Книга XXII

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Аномальный наследник. Пенталогия

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
6.70
рейтинг книги
Аномальный наследник. Пенталогия

Хозяин Стужи 7

Петров Максим Николаевич
7. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 7

Последний реанорец. Том IX

Павлов Вел
8. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Последний реанорец. Том IX

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф