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

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

Жанры

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

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

Шрифт:

01 void PrintWindow::printBox(QPainter *painter, const QString &str,

02 const QFont &font, const QBrush &brush)

03 {

04 painter->setFont(font);

05 int boxWidth = painter->window.width;

06 int textWidth = boxWidth - 2 * SmallGap;

07 int maxHeight = painter->window.height;

08 QRect textRect = painter->boundingRect(SmallGap, SmallGap,

09 textWidth, maxHeight, Qt::TextWordWrap, str);

10 int boxHeight = textRect.height + 2 * SmallGap;

11 painter->setPen(QPen(Qt::black, 2, Qt::SolidLine));

12 painter->setBrush(brush);

13 painter->drawRect(0, 0, boxWidth, boxHeight);

14 painter->drawText(textRect, Qt::TextWordWrap, str);

15 painter->translate(0, boxHeight);

16 }

Рис. 8.16.

Компоновка страницы справочника по цветам.

Функция printBox вычерчивает контур блока, затем отображает текст внутри него.

Графические средства OpenGL

OpenGL является стандартным программным интерфейсом, предназначенным для воспроизведения графики 2D и 3D. Приложения Qt могут отображать графику 3D, используя модуль QtOpenGL, который рассчитан на применение системной библиотеки OpenGL. При изложении данного раздела предполагается, что вы знакомы с OpenGL. Если вы не знакомы с OpenGL, хорошо начинать его изучение с посещения сайта http://www.opengl.org/.

Рис. 8.17. Приложение Тетраэдр.

Вывод графики при помощи OpenGL в приложении Qt выполняется достаточно просто: мы должны создать подкласс QGLWidget, переопределить несколько виртуальных функций и собрать приложение вместе с библиотеками QtOpenGL и OpenGL. Из-за того, что QGLWidget наследует QWidget, большая часть наших знаний остается применимой и здесь. Основное отличие заключается в том, что вместо QPainter для выполнения графических операций мы используем стандартные функции библиотеки OpenGL.

Для демонстрации этого подхода мы рассмотрим программный код приложения Тетраэдр, показанного на рис. 8.17. Это приложение отображает в пространстве тетраэдр или четырехгранник, грани которого имеют различные цвета. Пользователь может поворачивать тетраэдр, нажимая кнопку мышки и перемещая ее. Пользователь может задавать цвет поверхности грани путем двойного щелчка с последующим выбором цвета в диалоговом окне QColorDialog, которое выдается на экран.

01 class Tetrahedron : public QGLWidget

02 {

03 Q_OBJECT

04 public:

05 Tetrahedron(QWidget *parent = 0);

06 protected:

07 void initializeGL;

08 void resizeGL(int width, int height);

09 void paintGL;

10 void mousePressEvent(QMouseEvent *event);

11 void mouseMoveEvent(QMouseEvent *event);

12 void mouseDoubleClickEvent(QMouseEvent *event);

13 private:

14 void draw;

15 int faceAtPosition(const QPoint &pos);

16 GLfloat rotationX;

17 GLfloat rotationY;

18 GLfloat rotationZ;

19 QColor faceColors[4];

20 QPoint lastPos;

21 }

Класс Tetrahedron

наследует QGLWidget. Функции класса QGLWidget initializeGL, resizeGL и paintGL переопределяются. Обработчики событий мышки класса QWidget переопределяются обычным образом.

01 Tetrahedron::Tetrahedron(QWidget *parent)

02 : QGLWidget(parent)

03 {

04 setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer)

05 rotationX = -21.0;

06 rotationY = -57.0;

07 rotationZ = 0.0;

08 faceColors[0] = Qt::red;

09 faceColors[1] = Qt::green;

10 faceColors[2] = Qt::blue;

11 faceColors[3] = Qt::yellow;

12 }

В конструкторе мы вызываем функцию QGLWidget::setFormat для установки контекста экрана OpenGL и инициализируем закрытые переменные этого класса.

01 void Tetrahedron::initializeGL

02 {

03 qglClearColor(Qt::black);

04 glShadeModel(GL_FLAT);

05 glEnable(GL_DEPTH_TEST);

06 glEnable(GL_CULL_FACE);

07 }

Функция initializeGL вызывается только один раз перед вызовом функции paintGL. Именно в этом месте мы можем задавать контекст воспроизведения OpenGL, определять списки отображаемых элементов и выполнять остальную инициализацию.

Весь программный код является стандартным кодом OpenGL, за исключением вызовов функции qglClearColor класса QGLWidget. Если бы мы захотели строго придерживаться стандартных возможностей OpenGL, мы вместо этого вызывали бы функцию glClearColor при использовании режима RGBA и glClearIndex при использовании режима индексированных цветов.

01 void Tetrahedron::resizeGL(int width, int height)

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

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник