我在RedHat Linux上开发,cat / etc / redhat-release:
Red Hat Enterprise Linux Workstation release 7.2 (Maipo)
我正在使用Qt Creator 4.3.1:
Based on Qt 5.9.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)
我正在开发的项目是使用Qt 5.6.2 GCC 64bit,该项目是使用从QWidget派生的图形对象开发的,其中包括一个实时视频流。
不幸的是,我们在视频播放过程中经历过撕裂,这在视频周围显示的其他小部件中也很明显,我相信这是因为视频没有使用vsync。
我相信使用openGL可以纠正这种情况,目的是重写小部件,包括使用openGL进行视频播放。我花了几天时间试图找到完整且有效的解决方案,但到目前为止还未能找到完整且有效的解决方案。
我一直在使用QOpenGLWidget,在我用来测试的小部件中:
class clsElevStrip : public QOpenGLWidget, protected QOpenGLFunctions {
Q_OBJECT
在构造函数中,我设置了屏幕外渲染的格式:
//Create surface format for rendering offscreen
mobjFormat.setDepthBufferSize(24);
mobjFormat.setSamples(4);
mobjFormat.setVersion(3, 0);
mobjFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
setFormat(mobjFormat);
在paintGL方法中:
QOpenGLContext* pobjContext = context();
QSurface* pobjSurface = pobjContext->surface();
assert(pobjSurface != NULL);
int intSB1 = pobjSurface->format().swapBehavior();
qDebug() << (QString("paintGL:format: ")
+ QString::number(intSB1));
pobjContext->makeCurrent(pobjSurface);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0, 0.5, 0);
glEnd();
pobjContext->swapBuffers(pobjSurface);
在主显示屏上看不到任何内容,调试语句将格式显示为2(DoubleBuffering)。
如果我在构造函数中注释掉该行:
setFormat(mobjFormat);
debug语句将格式显示为0(DefaultSwapBehavior)。图形是可见的,我错过了什么?