Читаем QT 4: программирование GUI на С++ полностью

Кроме многопоточности и применения QProgressDialog существует совершенно другой способ работы с продолжительными операциями. Вместо выполнения заданной обработки сразу по поступлении запроса пользователя мы можем отложить эту обработку до момента перехода приложения в состояние ожидания. Этим способом можно пользоваться в тех случаях, когда обработку можно легко прерывать и затем возобновлять, поскольку мы не можем предсказать, как долго приложение будет в состоянии ожидания.

В Qt этот подход можно реализовать путем применения 0—миллисекундного таймера. Таймеры этого типа paботают при отсутствии ожидающих событий. Ниже приводится пример реализации функции timerEvent, которая демонстрирует обработку в состоянии ожидании:

01 void Spreadsheet::timerEvent(QTimerEvent *event)

02 {

03 if(event->timerId == myTimerId) {

04 while (step < MaxStep &&

05 !qApp->hasPendingEvents) {

06 performStep(step);

07 ++step;

08 }

09 } else {

10 QTableWidget::timerEvent(event);

11 }

12 }

Если фyнкция hasPendingEvents возвращает true, мы останавливаем процесс и передаем управление обратно Qt. Этот процесс будет возобновлен после обработки Qt всех своих ожидающих событий.

<p>Глава 8. Графика 2D и 3D</p>

Основу используемых в Qt средств графики 2D составляет класс QPainter (рисовальщик Qt). Этот класс может использоваться для рисования геометрически фигур (точек, линий, прямоугольников, эллипсов, дуг, сегментов и секторов окружности, многоугольников и кривых Безье), а также пиксельных карт, изображений и текста. Кроме того, QPainter поддерживает такие продвинутые функции, как сглаживание линий (antialiasing) при начертании фигур и букв в тексте, альфа—смешение (alpha blending), плавный переход цветов (gradient filling) и цепочки графических элементов (vector paths). QPainter также поддерживает преобразование координат, что делает графику 2D независимой от разрешающей способности.

QPainter может использоваться для вычерчивания на таких «устройствах рисования», как QWidget, QPixmap или QImage. QPainter удобно применять, когда мы программируем пользовательские виджеты или классы пользовательских графических элементов с особым внешним видом и режимом работы. Класс QPainter можно также использовать совместно с QPrinter для вывода графики на печатающее устройство и для генерации файлов PDF. Это значит, что во многих случаях мы можем использовать тот же самый программный код при отображении данных на экран и при получении напечатанных отчетов.

В качестве альтернативы классам QPainter можно использовать OpenGL. OpenGL является стандартной библиотекой графических средств 2D и 3D. Модуль QtOpenGL позволяет очень легко интегрировать OpenGL в приложения Qt.

<p>Рисование при помощи QPainter</p>

Чтобы начать рисовать на устройстве рисования (обычно это виджет), мы просто создаем объект QPainter и передаем ему указатель на устройство. Например:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

}

Мы можем рисовать различные фигуры, используя функции QPainter вида draw…. На рис 8.1 приведены наиболее важные из них.

Рис. 8.1. Часто используемые функции draw… рисовальщика QPainter.

Параметры настройки QPainter влияют на режим рисования. Некоторые из них устанавливаются на параметры настройки устройства, а другие инициализируются значениями по умолчанию. Тремя основными параметрами настройки рисовальщика являются перо, кисть и шрифт:

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

• Кисть представляет собой шаблон, который используется для заполнения геометрических фигур. Он обычно имеет цвет и стиль, но может также представлять собой текстуру (пиксельную карту, повторяющуюся бесконечно) или цветовой градиент.

• Шрифт используется для отображения текста. Шрифт имеет много атрибутов, в том числе название и размер.

Эти настройки можно в любое время модифицировать при помощи функций setPen, setBrush и setFont, вызываемых для объектов QPen, QBrush или QFont.

Рис. 8.2. Стили окончания линий и стили соединения линий.

Рис. 8.3. Стили пера.

Рис. 8.4. Определенные в Qt стили кисти.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже