Функция resizeGL вызывается один раз перед первым вызовом функции paintGL, но после вызова функции initializeGL. Oнa также всегда вызывается
при изменении размера виджета. Именно в этом месте мы можем задавать область отображения OpenGL, ее проекцию и делать любые другие настройки, зависящие от размера виджета.
Функция paintGL вызывается всякий раз, когда необходимо перерисовать виджет. Это напоминает функцию QWidget::paintEvent, но вместо функций класса QPainter здесь мы используем функции библиотеки OpenGL. Реальное рисование выполняется закрытой функцией draw.
В функции draw мы рисуем тетраэдр, учитывая повороты по осям x, у и z, а также цвета в массиве faceColors. Везде вызываются стандартные функции библиотеки OpenGL, за исключением вызова qglColor. Вместо этого мы могли бы использовать одну из функций OpenGL — glColor3d или glIndex — в зависимости от используемого режима.
08 GLfloat dy = GLfloat(event->y - lastPos.y) / height;
09 if (event->buttons & Qt::LeftButton) {
10 rotationX += 180 * dy;
11 rotationY += 180 * dx;
12 updateGL;
13 } else if (event->buttons & Qt::RightButton) {
14 rotationX += 180 * dy;
15 rotationZ += 180 * dx;
16 updateGL;
17 }
18 lastPos = event->pos;
19 }
Функции
класса QWidget mousePressEvent и mouseMoveEvent переопределяются, чтобы разрешить пользователю поворачивать изображение щелчком мышки и ее перемещением. Левая кнопка мышки позволяет пользователю поворачивать вокруг осей x и у, а правая кнопка мышки — вокруг осей x и z.
После модификации переменных rotationX и rotationY или rotationZ мы вызываем функцию updateGL для перерисовки сцены.
05 QColor color = QColorDialog::getColor(faceColors[face], this);
06 if (color.isValid) {
07 faceColors[face] = color;
08 updateGL;
09 }
10 }
11 }
Функция mouseDoubleClickEvent класса QWidget переопределяется, чтобы разрешить пользователю устанавливать цвет грани тетраэдра с помощью двойного щелчка. Мы вызываем закрытую функцию faceAtPosition для определения той грани, на которой находится курсор (если он вообще находится на какой-нибудь грани). При двойном щелчке по грани тетраэдра мы вызываем функцию QColorDialog::getColor для получения нового цвета для этой грани. Затем мы обновляем массив цветов faceColors новым цветом, и мы вызываем функцию updateGL для перерисовки экрана.
01 int Tetrahedron::faceAtPosition(const QPoint &pos)