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空闲问题的主要内容,如果未能解决你的问题,请参考以下文章

QOpenGLWidget显示黑屏

NIO就绪处理之OP_WRITE

NIO就绪处理之OP_WRITE

如何使用 QOpenGLWidget 渲染文本

QOpenglWidget 和 QML Quick

无法在 QopenGLWidget 中捕获 QkeyEvent