40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from PySide6.QtCore import Qt
|
|
from PySide6.QtGui import QColor, QImage, QPainter
|
|
from PySide6.QtMultimedia import QVideoFrame
|
|
from PySide6.QtWidgets import QWidget
|
|
|
|
|
|
class VideoWidget(QWidget):
|
|
def __init__(self, parent: QWidget | None = None) -> None:
|
|
super().__init__(parent)
|
|
self._frame: QImage | None = None
|
|
self.setAttribute(Qt.WA_OpaquePaintEvent)
|
|
self.setMinimumSize(320, 240)
|
|
|
|
def on_frame(self, frame: QVideoFrame) -> None:
|
|
image = frame.toImage()
|
|
if not image.isNull():
|
|
self._frame = image
|
|
self.update()
|
|
|
|
def paintEvent(self, event) -> None: # noqa: N802
|
|
painter = QPainter(self)
|
|
painter.setRenderHint(QPainter.SmoothPixmapTransform)
|
|
|
|
if self._frame is not None:
|
|
painter.fillRect(self.rect(), QColor(0, 0, 0))
|
|
scaled = self._frame.scaled(
|
|
self.size(),
|
|
Qt.KeepAspectRatio,
|
|
Qt.SmoothTransformation,
|
|
)
|
|
x = (self.width() - scaled.width()) // 2
|
|
y = (self.height() - scaled.height()) // 2
|
|
painter.drawImage(x, y, scaled)
|
|
else:
|
|
painter.fillRect(self.rect(), QColor(20, 20, 20))
|
|
painter.setPen(QColor(100, 100, 100))
|
|
painter.drawText(self.rect(), Qt.AlignCenter, "No camera feed")
|