Windows平台下QGLWidget设置swapInterval为0不生效如何解决
问题根因
你当前的写法不生效是因为QGLWidget的OpenGL上下文会在父类构造阶段就完成创建,你在构造函数内部调用setFormat的时候,底层上下文已经初始化完成,后续修改的格式参数不会覆盖已有的上下文配置。
正确解决方案
方案1:提前设置全局默认QGLFormat
在实例化GLWidget或者主窗口之前,先配置全局默认的OpenGL格式,控件初始化时会直接沿用该配置:
// 放在main函数中,QApplication初始化完成后、创建窗口实例前执行 QGLFormat defaultFormat; defaultFormat.setDepthBufferSize(24); defaultFormat.setStencilBufferSize(8); defaultFormat.setSampleBuffers(true); defaultFormat.setSamples(4); defaultFormat.setSwapInterval(0); QGLFormat::setDefaultFormat(defaultFormat); // 之后再创建你的主窗口/GLWidget实例即可
这种方案下你不需要在GLWidget的构造函数里再单独设置格式,直接查询就能得到正确的swap interval值。
方案2:构造时直接传递配置好的format给父类
修改GLWidget的构造逻辑,把提前生成好的格式参数直接传给QGLWidget的构造函数:
// 头文件中新增静态方法声明,修改构造函数实现 GLWidget::GLWidget(QWidget * parent): QGLWidget(buildGLFormat(), parent) { makeCurrent(); qDebug() << "Swap Interval +++++++ " << this->format().swapInterval(); } // 单独实现静态方法生成需要的格式配置 QGLFormat GLWidget::buildGLFormat() { QGLFormat format; format.setDepthBufferSize(24); format.setStencilBufferSize(8); format.setSampleBuffers(true); format.setSamples(4); format.setSwapInterval(0); return format; }
Windows平台额外注意事项
- 部分显卡驱动会强制开启垂直同步,无视应用层配置,需要先到NVIDIA控制面板/AMD Radeon软件中,把垂直同步的全局配置改为「由应用程序控制」
- 如果你使用的是Qt5及以上版本,更推荐替换已经被废弃的
QGLWidget为QOpenGLWidget,新控件的配置逻辑更清晰,不会出现参数不生效的问题
内容的提问来源于stack exchange,提问作者Summit
相关产品推荐
相关产品推荐

