Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将QWidget转换为QOpenGLWidget_Python_Qt_Pyqt_Pyqt5 - Fatal编程技术网

Python 将QWidget转换为QOpenGLWidget

Python 将QWidget转换为QOpenGLWidget,python,qt,pyqt,pyqt5,Python,Qt,Pyqt,Pyqt5,我有一个PyQt5应用程序,它在我的开发机器上运行得很好,但在我的目标嵌入式设备(Raspberry Pi 2)上有严重的性能问题。我将我的应用程序从PySide(基于Qt4)移植到PyQt5,以便在RPi2上使用基于eglfs的Qt构建,以期提高图形性能(通过硬件加速支持直接写入帧缓冲区),但我尚未转换基于光栅引擎的QWidgets(以及相关的QPainter()类)与硬件加速等效 下面是我工作的基于Qt4的QWidget()paintEvent类的摘录,该类在静态.png背景上绘制动态仪表指

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

下面是我工作的基于Qt4的QWidget()paintEvent类的摘录,该类在静态.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,但是没有显示仪表,并且不会产生任何错误

e、 g

我是否可以将现有的paintEvent QPainter.drawPie、QPainter.drawPixmap和QPainter.drawEllipse功能用于QOpenGLWidget,或者我是否需要完全重新启动以利用QOpenGLWidget的硬件加速功能

<>编辑:Qt5 C++文档在QP漆类上陈述以下内容:

OpenGL 2.0(ES)-此后端是硬件加速图形的主要后端。它可以在支持OpenGL 2.0或OpenGL/ES 2.0规范的台式机和嵌入式设备上运行。这包括过去几年生产的大多数图形芯片。可以通过在QOpenGLWidget上使用QPaint来启用引擎


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

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

出于任何原因,我刚刚在RPi2上测试了更新的QOpenGLWidget类,它运行得非常好,所以,也许我的开发机器上没有正确的OpenGL版本。也许你可以把这个评论作为答案发布出来?
class Qt5Widget(QtWidgets.QOpenGLWidget):