正在将QWidget转换为qobenglwidget

2024-10-04 05:24:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个PyQt5应用程序,它在我的开发机器上运行得很好,但是在我的目标嵌入式设备(Raspberry pi2)上有严重的性能问题。我将我的应用程序从PySide(基于Qt4)移植到PyQt5,以便能够在RPi2上使用基于eglfs的Qt构建,希望能够提高图形性能(通过硬件加速支持直接写入帧缓冲区),但是我还没有将基于光栅引擎的QWidgets(以及相关联的QPainter()类)转换为硬件加速的等价物。在

下面是我正在工作的基于Qt4的QWidget()paintEvent类的节选,该类在static.png背景上绘制动态仪表指针:

class Qt4Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Qt4Widget, self).__init__(parent)
        self.Background = QtGui.QPixmap("Images/Background.png")

        #Other initialisation activity

    #The paintEvent is called from various Qt4Widget.update(self) calls
    def paintEvent(self, e):
        self.Painter = QtGui.QPainter(self)
        self.Painter.setRenderHint(self.Painter.Antialiasing)

        self.Rect = e.rect()
        self.MainRect = QtCore.QRect(self.Rect)
        self.MainSize = self.MainRect.size()
        self.MainPosition = self.MainRect.center()
        self.MainRect.moveCenter(QtCore.QPoint(self.MainPosition.x()-self.MainSize.width(), self.MainPosition.y()-self.MainSize.height()))

        self.MainRect.setSize(self.MainSize*0.85)
        self.MainRect.moveCenter(self.MainPosition)

        self.RefillRect = QtCore.QRect(self.MainRect)
        self.MainSize = self.RefillRect.size()
        self.MainPosition = self.RefillRect.center()
        self.RefillRect.moveCenter(QtCore.QPoint(self.MainPosition.x()-self.MainSize.width(), self.MainPosition.y()-self.MainSize.height()))

        self.RefillRect.setSize(self.MainSize*0.6)
        self.RefillRect.moveCenter(self.MainPosition)

        self.MainPainter.setPen(QtCore.Qt.NoPen)

        self.MainPainter.drawPixmap(self.Rect, self.Background)

        self.Painter.save()

        self.Gradient = QtGui.QConicalGradient(QtCore.QPointF(self.MainRect.center()), 273.0)
        self.Gradient.setColorAt(.8, QtCore.Qt.white)
        self.Gradient.setColorAt(.4, QtCore.Qt.white)
        self.Gradient.setColorAt(.2, QtCore.Qt.red)
        self.Painter.setBrush(self.Gradient)

        self.Painter.drawPie(self.MainRect, 225.0*16, self.Value*16)
        self.Painter.restore()

        self.Painter.setBrush(QtGui.QBrush(self.Background.scaled(self.Rect.size())))
        self.Painter.drawEllipse(self.RefillRect)

        self.Painter.end()

应用程序每秒更新仪表60次(60Hz显示),这在我的开发机器上很容易实现。然而,当我在RPi2上运行cProfile超过10秒的执行时间(600次更新)时,大约需要50秒才能完成,paintEvent()是一个主要瓶颈。我已经将QT4Widget类改为QOpenGLWidget,但是没有显示量规,也不会产生任何错误。在

例如

^{pr2}$

我可以使用现有的paintEvent吗Qpaiter.drawPie, Qpaiter.drawPixmap以及Qpaiter.draullipse公司使用QOpenGLWidget的函数,还是需要重新启动才能使用QoPengWidget的硬件加速?在

编辑:qt5c++文档在qpaint类上声明了以下内容:

OpenGL 2.0 (ES) - This backend is the primary backend for hardware accelerated graphics. It can be run on desktop machines and embedded devices supporting the OpenGL 2.0 or OpenGL/ES 2.0 specification. This includes most graphics chips produced in the last couple of years. The engine can be enabled by using QPainter onto a QOpenGLWidget.

有了这个定义,我在QOpenGLWidget上维护现有的QPainter()函数的方法正确吗?如果是,为什么没有显示?在


Tags: rectselfqtbackgroundpainterqtguigradientqtcore
1条回答
网友
1楼 · 发布于 2024-10-04 05:24:53

根据QT5文档,QPainter()类可以在QOpenGLWidget上使用,就像在基于光栅的QWidget上使用一样。因此,将所有的QWidget类更改为QOpenGLWidget类应该可以启用QPainter()类的硬件加速操作,这正是我在我的实例中发现的。在

相关问题 更多 >