Как настроить стиль Qbrush с эффектом размытия - PullRequest
0 голосов
/ 09 июля 2020

Я участвую в проекте отображения, зависящего от взгляда, и мне нужно настроить стиль размытия Qbru sh. Я попытался использовать QGraphicsBlurEffect для достижения своей цели, однако при использовании QGraphicsBlurEffect для огромного QGraphicsEllipseItem (круг, радиус> 2500 пикселей) задержка рендеринга становится очевидной, я тестировал QGraphicsBlurEffect для относительно небольшого QGraphicsItem, он работает хорошо. поэтому я хочу определить свой собственный стиль размытия Qbru sh. Ниже приведен демонстрационный код.

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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...