将图像显示与屏幕刷新率同步

时间:2015-02-09 08:01:51

标签: opengl pyqt pyqt4 pyopengl

程序的功能:使用PyQt4显示图像(简单的jpg / png文件)。

目标:在屏幕上显示/绘制图像,与屏幕刷新率同步。

我希望实现的伪代码示例:

pixmap = set_openGL_pixmap(myPixmap) 

draw_openGL_pixmap(pixmap) 

doSomthingElse()

理想情况下,draw_openGL_pixmap(pixmap)函数应仅在刷新屏幕并显示图像后返回。在真正绘制图像后,将立即执行doSomthingElse()

到目前为止我尝试了什么

  • 在将pixmap设置为PyQt标签后使用PyQt's QApplication.processEvents() 这似乎没有诀窍,因为它没有处理与屏幕刷新率同步。
  • 使用QGLFormat.setSwapInterval() 尽管这应该可以像文档中所说的那样工作,但PyQt在调用QApplication.processEvents()之前不会在屏幕上绘制图像,或直到控件返回到应用程序的事件循环(即,当我调用的所有函数都已返回并且GUI正在等待新事件时)。
  • 使用QGraphicsView - 即使使用OpenGL窗口小部件渲染图像,只有在显示父窗口时才会显示图像,因此实际显示时间仍取决于PyQt's事件循环。
  • 使用QWidget.repaint() - repaint()方法将立即显示图像。但是,我不认为在调用repaint()时,它会等到屏幕刷新事件返回之前。

总结 如何在发出命令的同时使PyQt在屏幕上(在小部件中)绘制图像,与屏幕刷新率同步,而不管PyQt's事件循环。

1 个答案:

答案 0 :(得分:2)

感谢Trialarion对我的问题的评论,我找到了解决方案here

对于任何有兴趣的人,这里显示的图像与屏幕刷新率同步显示图像:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtOpenGL import *

app = QApplication(sys.argv)

# Use a QGLFormat with the swap interval set to 1
qgl_format = QGLFormat()
qgl_format.setSwapInterval(1)

# Construct a QGLWidget using the above format
qgl_widget = QGLWidget(qgl_format)

# Set up a timer to call updateGL() every 0 ms
update_gl_timer = QTimer()
update_gl_timer.setInterval(0)
update_gl_timer.start()
update_gl_timer.timeout.connect(qgl_widget.updateGL)

# Set up a graphics view and a scene
grview = QGraphicsView()
grview.setViewport(qgl_widget)
scene = QGraphicsScene()
scene.addPixmap(QPixmap('pic.png'))
grview.setScene(scene)

grview.show()

sys.exit(app.exec_())