QT交互
通过QT的控件动作进行交互,可以实现用户控制绘制、清空和切换模式。
- 如果需要从painGL()以外的位置触发重新绘制(典型示例是使用计时器设置场景动画),则应调用widget的update()函数来安排更新。
- 调用paintGL()、resizeGL()或initializeGL()时,widget的OpenGL呈现上下文将变为当前。如果需要从其他位置(例如,在widget的构造函数或自己的绘制函数中)调用标准OpenGL API函数,则必须首先调用makeCurrent()。
定义绘图状态切换函数
首先在我们自定义的OpenGLWidget类中定义一个能够绘制不同形状的函数:
//zjjopenglwidget.h
enum Shape{None, Rect, Circle, Triangle};
// 绘制图形
void drawShape(Shape shape);
// 线框模式
void setWireFrame(bool wireframe);
Shape m_shape;
//zjjopenglwidget.cpp
void ZjjOpenGLWidget::drawShape(Shape shape)
{
m_shape = shape;
//如果需要从painGL()以外的位置触发重新绘制(典型示例是使用计时器设置场景动画),
//则应调用widget的update()函数来安排更新。
update();
}
void ZjjOpenGLWidget::setWireFrame(bool wireframe)
{
//调用paintGL()、resizeGL()或initializeGL()时,widget的OpenGL呈现上下文将变为当前。
//如果需要从其他位置(例如,在widget的构造函数或自己的绘制函数中)调用标准OpenGL API函数,
//则必须首先调用makeCurrent()。
makeCurrent();
if(wireframe)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
update();
doneCurrent();
}
... ...
void ZjjOpenGLWidget::paintGL()
{
... ...
// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
switch (m_shape) {
case Rect:
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
break;
default:
break;
}
... ...
}
定义UI控件的响应函数
双击triggered()
,生成相应的响应函数:
同理,添加上Clear
按键的响应函数。接着,我们还需要添加一个切换模式的按键,这个按键不是触发,而是能够保持状态的,创建方法如下:
更换按键底色:
同样,我们需要添加按键相应的响应函数:
void MainWindow::on_actionactDrawRect_triggered()
{
ui->openGLWidget->drawShape(ZjjOpenGLWidget::Rect);
}
void MainWindow::on_actionClear_triggered()
{
ui->openGLWidget->drawShape(ZjjOpenGLWidget::None);
}
void MainWindow::on_actWireframe_Mode_triggered()
{
ui->openGLWidget->setWireFrame(ui->actWireframe_Mode->isChecked());
}