python - 如何自定义具有模糊效果的 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_())
解决方案
推荐阅读
- javafx - LineChart - 我可以放大/缩小并从代码平移吗?
- twilio - Twilio Studio HTTP 请求
- java - 如何查找与特定枚举类型相关的 name() 的所有用法
- angular - 从 Angular 5 的 Guard 中的订阅返回一个布尔值
- docker - 在 Docker 中更新 Prometheus 主机/端口
- html - 图像边框宽度加起来就是图像大小(仅在 Chrome 中)
- batch-file - 使用 CPDF 批量文件到多个文件
- r - R Xts 对齐时间(不是日期)
- r - 来自大型文档集的 R 词频
- python - Python字典打印第一个值并忽略空