I have a QGraphicsVideoItem added to a QGraphicsView widget. How can I crop the item so I don't see part of the displayed video? I have tried doing this:
class OverlayWidget(QWidget):
def __init__(self):
super().__init__()
scene = QGraphicsScene()
self.video_view = QGraphicsView(self)
self.video_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.video_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.video_view.setScene(scene)
player_1 = QMediaPlayer(self)
self.video_item_1 = QGraphicsVideoItem()
player_1.setVideoOutput(self.video_item_1)
scene.addItem(self.video_item_1)
# player_1.setSource("V.mp4")
# player_1.play()
player_2 = QMediaPlayer(self)
self.video_item_2 = QGraphicsVideoItem()
self.video_item_2.setAspectRatioMode(Qt.KeepAspectRatio)
player_2.setVideoOutput(self.video_item_2)
scene.addItem(self.video_item_2)
# player_2.setSource("V_compressed.mp4")
# player_2.play()
self.slider = QSlider(Qt.Horizontal, self)
self.slider.setStyleSheet("""
QSlider::groove:horizontal {
background: transparent;
}
QSlider::handle:horizontal {
background: white;
border: 1px solid black;
border-radius: 3px;
width: 10px;
}
""")
self.slider.valueChanged.connect(self.crop_video)
def resizeEvent(self, event):
super().resizeEvent(event)
self.video_view.resize(self.size())
self.slider.resize(self.size())
self.slider.setRange(0, self.video_view.width())
self.video_item_1.setSize(self.video_view.size())
self.video_item_2.setSize(self.video_view.size())
self.crop_video()
def crop_video(self):
# Crop the video substracting the slider right area
self.video_item_2.setPos(self.slider.value(), 0)
self.video_item_2.setOffset(QPoint(-self.slider.value(), 0))
But the part of the video that has negative X coordinate is still drawn. How can I hide it?
(I don't use QVideoWidget because I need to have the slider over the video, and it seems that the video is always on top of other widgets. I could use QVideoWidget if there is no other choice and put the slider outside the videos)