833
29.4
Videoplayer
Schuld an der Misere ist das QLabel-Widget. Seine voreingestellten Regeln zur Größenän-
derung (Size Policy) besagen, dass es sich bei einer Veränderung der Fenstergröße in alle
Richtungen möglichst weit ausdehnen soll.
Zur Lösung fügen Sie in der Definition der Methode
createWidgets() folgende Anwei-
sung ein:
Sie bewirkt, dass sich das
QLabel-Widget bei einer Größenänderung in horizontaler Rich-
tung ausdehnt (erster Parameter) und in vertikaler Richtung fixiert bleibt (zweiter Para-
meter).
29.4.4 Das Dashboard bei Mausbewegungen einblenden
In diesem Abschnitt entwickeln Sie einen Videoplayer, in dem das Dashboard mit Schaltflä-
chen und Reglern unsichtbar bleibt und nur dann für kurze Zeit eingeblendet wird, wenn
die Maus bewegt wird.
Abb. 29.14: Das Dashboard mit Schaltflächen und Schieberegler wird ein- und ausgeblendet.
In diesem Projekt verwenden Sie folgende Techniken:
Die Schaltflächen werden einem Frame-Widget (Objekt der Klasse QFrame) zugeordnet.
Einen Frame kann man mit
hide() ausblenden und mit show() einblenden.
Das Dashboard mit den Schaltflächen soll auf dem Video-Widget platziert werden und
dabei einen Teil des Videobildes verdecken. Sie setzen es mit
move() an die richtige
Stelle.
Das Dashboard soll immer am unteren Rand zu sehen sein, auch wenn das Fenster
geändert wird. Deshalb muss bei einer Veränderung der Fenstergröße (
resize-Event)
das Dashboard neu platziert werden.
self.label.setSizePolicy(QSizePolicy.Expanding,
QSizePolicy.Fixed)
Kapitel 29
Multimediaanwendungen mit Qt
834
Das Programm muss die Maus beobachten. Bei einer Mausbewegung wird das Dash-
board eingeblendet (
show()) und ein Timer gestartet (Objekt der Klasse QTimer).
Der Timer sendet nach der eingestellten Zeit (z.B. 2 Sekunden) ein timeout-Signal. Die-
ses soll veranlassen, dass das Dashboard wieder ausgeblendet wird.
Skript:
#! /python34/pythonw.exe
# videoplayer_dashboard_hide.pyw
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import (QMediaPlayer,
QMediaContent)
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setMouseTracking(True) #1
self.createWidgets()
self.createLayout()
self.show()
def createWidgets(self):
self.setWindowTitle("Videoplayer")
self.videoWidget = QVideoWidget(self)
self.videoWidget.setMinimumSize(320,180)
self.player = QMediaPlayer(self)
self.player.setVideoOutput(self.videoWidget)
self.player.setVolume(0)
self.playButton = QPushButton("Start")
self.playButton.clicked.connect(self.play)
self.playButton.setEnabled(False)
self.selectButton = QPushButton("Wähle Video")
self.selectButton.clicked.connect(self.selectFile)
self.volumeSlider = QSlider(Qt.Horizontal)
self.volumeSlider.sliderMoved.connect(
self.player.setVolume)
self.volumeSlider.setRange(0, 100)
self.dashboard = QFrame(self) #2
self.dashboard.resize(300,40) #3
835
29.4
Videoplayer
self.dashboard.move(0,
self.height()-self.dashboard.height()- 2) #4
self.timer = QTimer(self) #5
self.timer.timeout.connect(self.dashboard.hide)
def createLayout(self):
hBox = QHBoxLayout()
hBox.addWidget(self.playButton)
hBox.addWidget(self.selectButton)
hBox.addWidget(self.volumeSlider)
self.dashboard.setLayout(hBox) #6
vBox = QVBoxLayout()
vBox.addWidget(self.videoWidget)
self.setLayout(vBox)
def play (self):
if self.playButton.text() == "Start":
self.playButton.setText("Pause")
self.player.play()
else:
self.playButton.setText("Start")
self.player.pause()
def selectFile(self):
fileName, _ = QFileDialog.getOpenFileName(self,
"Video öffnen")
self.media = QMediaContent(QUrl(fileName))
self.player.setMedia(self.media)
self.playButton.setEnabled(True)
def mouseMoveEvent(self, event): #7
self.dashboard.show() #8
self.timer.start(2000) #9
def resizeEvent(self, event): #10
self.dashboard.move(0,
self.height()-self.dashboard.height()- 2)
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.