【问题标题】:PyQt5 QOpenGLWidget idle issuePyQt5 QOpenGLWidget空闲问题
【发布时间】:2015-09-06 21:55:13
【问题描述】:

我正在使用 PyQt5,并且在使用 QOpenGLWidget 时遇到了一些困难。问题是在 QOpenGLWidget 中绘制任何东西的唯一方法是使用它的 paintGL() 方法,这似乎被破坏了。以下是发生的情况:一旦程序启动,小部件会准确地刷新 4 次并停止。让它再次工作的唯一方法是更改​​活动窗口(将其切换到终端或任何东西),然后绘制 2 个下一帧。将窗口切换回来 - 获取接下来的 2 帧 - 依此类推。有谁知道那里发生了什么?或者如何避免这个问题?

【问题讨论】:

  • 同样的事情发生在我身上,但是当窗口切换时我没有得到额外的事件。我一开始只得到 2 个事件。如果其他 qt 窗口不可见,我确实会收到更多事件,等等。

标签: python qt qt5 pyqt5


【解决方案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吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多