首页 > 解决方案 > 如何自定义具有模糊效果的 Qbrushstyle

问题描述

我正在参与一个凝视条件显示项目,需要自定义一个模糊风格的 Qbrush。我曾尝试使用 QGraphicsBlurEffect 来达到我的目的,但是,当使用 QGraphicsBlurEffect 到一个巨大的 QGraphicsEllipseItem(圆形,半径>2500px)时,渲染延迟变得很明显,我已经测试了 QGraphicsBlurEffect 到相对较小的 QGraphicsItem,它工作得很好。所以我想定义我自己的模糊风格Qbrush。下面是演示代码。

import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QGraphicsBlurEffect
import tobii_research as tr

class Demo(QWidget):
    GazepositionChanged = QtCore.pyqtSignal(float, float)
    def __init__(self):
        super(QWidget,self).__init__()
        self.eyetrackers = tr.find_all_eyetrackers()
        self.my_eyetracker = self.eyetrackers[0]
        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 680, 480)#ignore
        self.setWindowTitle('DEMO')
        self.videosize = QtCore.QSizeF(1920 - 3, 1080 - 3)

        self._gv = QtWidgets.QGraphicsView()
        self._scene = QtWidgets.QGraphicsScene(0, 0, self.videosize.width(), self.videosize.height(), self._gv)
        self._gv.setScene(self._scene)

        #button setup
        self.pushButton_Start = QtWidgets.QPushButton(self._gv)
        self.pushButton_Start.setText("Start Test")
        self.pushButton_Start.move(1920/2-150, 540)
        self.pushButton_END = QtWidgets.QPushButton(self._gv)
        self.pushButton_END.setText("END Test")
        self.pushButton_END.move(1920/2+70, 540)
        self.pushButton_Start.clicked.connect(self.Start)
        self.pushButton_END.clicked.connect(self.END)

        #denote where is watching on display
        self.GazeItem = QtWidgets.QGraphicsEllipseItem(QtCore.QRectF(0,0, 500, 500))
        self.GazeItem.setPen(QtGui.QPen(QtCore.Qt.gray))
        # Blur effect, Not good for large GraphicsItem
        # blureffect=QGraphicsBlurEffect()
        # blureffect.setBlurRadius(10)
        # blureffect.setBlurHints(QGraphicsBlurEffect.AnimationHint)
        # self.GazeItem.setGraphicsEffect(blureffect)
        self._scene.addItem(self.GazeItem)

        #TODO:I want to customize a Brushstyle with blureffect here.
        ##
        QCustomized_Brush = self.Create_BrushStyle()
        self.GazeItem.setBrush(QCustomized_Brush)
        ###

        self.GazepositionChanged.connect(self.GazeItem.setPos)
        self._gv.showFullScreen()

    def gaze_data_callback(self, gaze_data_):
        #callback function, 60 times per second.
        gaze_left_eye = gaze_data_['left_gaze_point_on_display_area']
        leftx_Oringinal = gaze_left_eye[0]
        lefty_Oringinal = gaze_left_eye[1]
        Gaze = [leftx_Oringinal, lefty_Oringinal]
        Screensize = [1920, 1080]
        self.GazepositionChanged.emit(Gaze[0] * Screensize[0] - 250, Gaze[1] * Screensize[1] - 250)#update QGraphicItem position


    def Start(self):
        self.my_eyetracker.subscribe_to(tr.EYETRACKER_GAZE_DATA, self.gaze_data_callback, as_dictionary=True)
        self.pushButton_Start.setEnabled(False)
        self.pushButton_END.setEnabled(True)

    def END(self):
        self.my_eyetracker.unsubscribe_from(tr.EYETRACKER_GAZE_DATA, self.gaze_data_callback)
        self.pushButton_Start.setEnabled(True)
        self.pushButton_END.setEnabled(False)

    def Create_Brush(self):
        #Create Qbrush with blur style
        #return brush
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Demo()
    sys.exit(app.exec_())

低性能案例如下所示:

import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QGraphicsBlurEffect
import tobii_research as tr

class Demo(QWidget):
    GazepositionChanged = QtCore.pyqtSignal(float, float)
    def __init__(self):
        super(QWidget,self).__init__()
        self.eyetrackers = tr.find_all_eyetrackers()
        self.my_eyetracker = self.eyetrackers[0]
        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 680, 480)#ignore
        self.setWindowTitle('DEMO')
        self.videosize = QtCore.QSizeF(1920 - 3, 1080 - 3)

        self._gv = QtWidgets.QGraphicsView()
        self._scene = QtWidgets.QGraphicsScene(0, 0, self.videosize.width(), self.videosize.height(), self._gv)
        self._gv.setScene(self._scene)

        #button setup
        self.pushButton_Start = QtWidgets.QPushButton(self._gv)
        self.pushButton_Start.setText("Start Test")
        self.pushButton_Start.move(1920/2-150, 540)
        self.pushButton_END = QtWidgets.QPushButton(self._gv)
        self.pushButton_END.setText("END Test")
        self.pushButton_END.move(1920/2+70, 540)
        self.pushButton_Start.clicked.connect(self.Start)
        self.pushButton_END.clicked.connect(self.END)

        #denote where is watching on display
        self.GazeItem = QtWidgets.QGraphicsEllipseItem(QtCore.QRectF(0,0, 5500, 5500))
        self.GazeItem.setPen(QtGui.QPen(QtCore.Qt.gray))
        self.GazeItem.setStartAngle(180 * 16)
        self.GazeItem.setSpanAngle(180 * 16)
        blureffect=QGraphicsBlurEffect()
        blureffect.setBlurRadius(10)
        blureffect.setBlurHints(QGraphicsBlurEffect.AnimationHint)
        self.GazeItem.setGraphicsEffect(blureffect)
        self._scene.addItem(self.GazeItem)
        self.GazeItem.setBrush(QtGui.QBrush(QtCore.Qt.gray))

        self.GazepositionChanged.connect(self.GazeItem.setPos)
        self._gv.showFullScreen()

    def gaze_data_callback(self, gaze_data_):
        #callback function, 60 times per second.
        gaze_left_eye = gaze_data_['left_gaze_point_on_display_area']
        leftx_Oringinal = gaze_left_eye[0]
        lefty_Oringinal = gaze_left_eye[1]
        Gaze = [leftx_Oringinal, lefty_Oringinal]
        Screensize = [1920, 1080]
        self.GazepositionChanged.emit(Gaze[0] * Screensize[0] - 2750, Gaze[1] * Screensize[1] - 2750)#update QGraphicItem position

    def Start(self):
        self.my_eyetracker.subscribe_to(tr.EYETRACKER_GAZE_DATA, self.gaze_data_callback, as_dictionary=True)
        self.pushButton_Start.setEnabled(False)
        self.pushButton_END.setEnabled(True)

    def END(self):
        self.my_eyetracker.unsubscribe_from(tr.EYETRACKER_GAZE_DATA, self.gaze_data_callback)
        self.pushButton_Start.setEnabled(True)
        self.pushButton_END.setEnabled(False)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Demo()
    sys.exit(app.exec_())

标签: pythonpyqtpyqt5qbrush

解决方案


推荐阅读