GLWidget也要进行相应的修改:
glwidget.h
#ifndef GLWIDGET_H #define GLWIDGET_H #include#include glthread.h #include class GLWidget : public QGLWidget { public: GLWidget(QWidget *parent); void startRendering(); void stopRendering(); protected: void resizeEvent(QResizeEvent *evt); void paintEvent(QPaintEvent *); void closeEvent(QCloseEvent *evt); GLThread glt; }; #endif // GLWIDGET_H
glwidget.cpp
#include glwidget.h
GLWidget::GLWidget(QWidget *parent)
: glt(this)
{
setAutoBufferSwap(false);
resize(320, 240);
}
void GLWidget::startRendering()
{
glt.start();
}
void GLWidget::stopRendering()
{
glt.stop();
glt.wait();
}
void GLWidget::resizeEvent(QResizeEvent *evt)
{
glt.resizeViewport(evt->size());
}
void GLWidget::paintEvent(QPaintEvent *)
{
// Handled by the GLThread.
}
void GLWidget::closeEvent(QCloseEvent *evt)
{
stopRendering();
QGLWidget::closeEvent(evt);
}
注意这里用到了C++的一个小技巧,前向声明。当两个类要互相引用的时候不能够互相包含头文件,在一个类的头文件中,必须用Class + 类名作为前向声明。而在这个类的cpp中要访问另一个类的具体方法的话,必须包含那个类的头文件。
这里还涉及到数据的访问。最开始的例子用的是信号槽的方式进行访问,而这里直接使用的指针进行访问。
渲染结果:一个不断旋转的正方形,(假装看见了...)

线程安全
待研究
一些琐碎
待研究