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

на главную - закладки

Жанры

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

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

Шрифт:

Вызов setSizePolicy устанавливает политику размера виджета по обоим направлениям на значение QSizePolicy::Expanding. Это подсказывает любому менеджеру компоновки, который ответственен за виджет, что он прежде всего склонен к росту, но может также сжиматься. Такая настройка параметров типична для виджетов, которые занимают много места на экране. По умолчанию в обоих направлениях устанавливается политика QSizePolicy::Preferred, означающая, что для виджета предпочтительно устанавливать размер на основе его идеального размера, но он может сжиматься до своего минимального идеального размера или расширяться в любых пределах при необходимости.

Вызов setFocusPolicy(Qt::StrongFocus) заставляет виджет получать фокус при нажатии клавиши табуляции Tab. Когда Plotter получает фокус, он будет реагировать на события нажития клавиш. Виджет Plotter понимает несколько клавиш: «+» для увеличения изображения, «—» для уменьшения изображения и клавиш стрелок для прокрутки вверх, вниз, влево и вправо.

Рис. 5.9. Скроллинг виджета Plotter.

Также в конструкторе мы создаем две кнопки QToolButtons, каждая из которых имеет пиктограмму. Эти кнопки дают возможность пользователю увеличивать и уменьшать масштаб изображения. Пиктограммы кнопок хранятся в файле ресурсов, поэтому любое приложение, использующее виджет Plotter, должно иметь следующую строку в файле .pro:

RESOURCES = plotter.qrc

Этот файл ресурсов похож на файл, который мы использовали для приложения Электронная таблица:

<!DOCTYPE RCC><RCC version="1.0">

<qresource>

<file>images/zoomin.png</file>

<file>images/zoomout.png</file>

</qresource>

</RCC>

Вызовы функции adjustSize устанавливают для кнопок их идеальные размеры. Кнопки не размещаются в менеджере компоновки; вместо этого мы задаем их положение вручную при обработке события изменения размеров виджета Plotter. Поскольку мы не пользуемся никакими менеджерами компоновки, необходимо явно задавать родительский виджет кнопок, передавая this конструктору QPushButton.

Вызов в конце функции setPlotSettings завершает инициализацию.

022 void Plotter::setPlotSettings(const PlotSettings &settings)

023 {

024 zoomStack.clear;

025 zoomStack.append(settings);

026 curZoom = 0;

027 zoomInButton->hide;

028 zoomOutButton->hide;

029 refreshPixmap;

030 }

Функция setPlotSettings устанавливает настройки PlotSettings для отображения графика. Ее вызывает конструктор Plotter, и она может также вызываться пользователями класса. Построитель кривых начинает работу с принятого по умолчанию масштаба изображения. Каждый раз, когда пользователь увеличивает изображение, создается новый экземпляр PlotSettings, который затем помещается в стек масштабов изображения. Этот стек масштабов изображений представлен двумя переменными—членами:

zoomStack содержит настройки для различных масштабов изображения в объекте QVector<PlotSettings>;

curZoom содержит индекс текущего элемента PlotSettings стека zoomStack.

После вызова функции setPlotSettings в стеке масштабов изображений будет находиться только один элемент, а кнопки Zoom In и Zoom Out будут скрыты. Эти кнопки не будут видны на экране до тех пор, пока мы не вызовем для них функцию show в слотах zoomIn и zoomOut. (Обычно для показа всех дочерних виджетов достаточно вызвать функцию show для виджета верхнего уровня. Но когда мы явным образом вызываем для дочернего виджета функцию hide, этот виджет будет скрыт до вызова для него функции show.)

Вызов функции refreshPixmap необходим для обновления изображения на экране. Обычно мы вызываем функцию update, но здесь мы поступаем немного по-другому, потому что хотим иметь пиксельную карту QPixmap постоянно в обновленном состоянии. После регенерации пиксельной карты функция refreshPixmap вызывает update для помещения пиксельной карты на виджет.

031 void Plotter::zoomOut

032 {

033 if (curZoom > 0) {

034 --curZoom;

035 zoomOutButton->setEnabled(curZoom > 0);

036 zoomInButton->setEnabled(true);

037 zoomInButton->show;

038 refreshPixmap;

039 }

040 }

Слот zoomOut уменьшает масштаб диаграммы, если она отображена крупным планом. Он уменьшает на единицу текущий масштаб изображения и включает или выключает кнопку ZoomOut, в зависимости от возможности дальнейшего уменьшения диаграммы. Кнопка Zoom In включается и отображается на экране, а изображение диаграммы обновляется посредством вызова функции refreshPixmap.

041 void Plotter::zoomIn

042 {

043 zoomInButton->setEnabled(curZoom< zoomStack.count - 1);

044 if (curZoom < zoomStack.count - 1) {

045 ++curZoom;

046 zoomOutButton->setEnabled(true);

047 zoomOutButton->show;

048 refreshPixmap;

049 }

050 }

Если пользователь сначала увеличил изображение, а затем вновь его уменьшил, настройки PlotSettings для следующего масштаба изображения уже будут в стеке масштабов изображения, и мы можем увеличить его. (В противном случае можно все же увеличить изображение при помощи резиновой ленты.)

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

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Ермак. Телохранитель

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

На границе империй. Том 10. Часть 9

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

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Кодекс Крови. Книга ХIII

Борзых М.
13. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХIII

Древесный маг Орловского княжества 3

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

Эпоха Опустошителя. Том V

Павлов Вел
5. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том V

Граф Книга третья

Первухин Андрей Евгеньевич
10. Ученик
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Граф Книга третья

СД. Том 14

Клеванский Кирилл Сергеевич
Сердце дракона
Фантастика:
фэнтези
героическая фантастика
7.44
рейтинг книги
СД. Том 14

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

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