PyQt5 QOpenGLWidget空闲问题
Posted
技术标签:
【中文标题】PyQt5 QOpenGLWidget空闲问题【英文标题】:PyQt5 QOpenGLWidget idle issue 【发布时间】:2015-09-06 21:55:13 【问题描述】:我正在使用 PyQt5,并且在使用 QOpenGLWidget 时遇到了一些困难。问题是在 QOpenGLWidget 中绘制任何东西的唯一方法是使用它的 paintGL() 方法,这似乎被破坏了。以下是发生的情况:一旦程序启动,小部件会准确地刷新 4 次并停止。让它再次工作的唯一方法是更改活动窗口(将其切换到终端或任何东西),然后绘制 2 个下一帧。将窗口切换回来 - 获取接下来的 2 帧 - 依此类推。有谁知道那里发生了什么?或者如何避免这个问题?
【问题讨论】:
同样的事情发生在我身上,但是当窗口切换时我没有得到额外的事件。我一开始只得到 2 个事件。如果其他 qt 窗口不可见,我确实会收到更多事件,等等。 同样的问题:***.com/questions/30748991/… 【参考方案1】:我通过创建一个默认绑定到QOpenGLWidget.timerEvent()
方法的BasicTimer
对象解决了这个问题。在运行每个计时器滴答的timerEvent
方法中,然后我调用update()
方法让小部件自行刷新。这是一段代码 sn-p,应该可以让您大致了解一下:
from PyQt5.QtWidgets import QOpenGLWidget
from PyQt5.QtCore import QBasicTimer
class OpenGLWidget(QOpenGLWidget):
def __init__(self):
self._timer = QBasicTimer() # creating timer
self._timer.start(1000 / 60, self) # setting up timer ticks to 60 fps
def paintGL(self):
pass # some painting code here
def timerEvent(self, QTimerEvent):
self.update() # refreshing the widget
【讨论】:
感谢您花时间写这篇文章!我已经在做很多类似的事情,但它不起作用。 (我有一个启动计时器的插槽,它最终调用self.update
。)我验证它正在调用self.update
,并且正在调用update(self)
,但这似乎不会导致任何paintGL
来电。
你的paintGL()
有什么作用吗?我的意思是它是否至少会调用一些第一次调用,直到它停止?无论如何,我发现重要的是创建一个QBasicTimer
,因为QTimer
并没有默认绑定到timerEvent
,这对我来说是一个死胡同。你在用QBasicTimer
吗?以上是关于PyQt5 QOpenGLWidget空闲问题的主要内容,如果未能解决你的问题,请参考以下文章