QVideoWidget в полноэкранном режиме больше не реагирует на горячие клавиши или колесо мыши - PullRequest
1 голос
/ 28 февраля 2020

Использование QVideoWidget в PySide2 (хотя часть python может быть незначительной). Я настроил свои горячие клавиши с помощью QShortcut, и все это прекрасно работает. Когда я нажимаю «F», чтобы войти в полноэкранный режим, который тоже работает, но потом я не могу уйти. Ни один из моих горячих клавиш или обработчиков событий мыши не работает. Я застрял в полноэкранном режиме.

Есть ли способ дать ему возможность реагировать даже в полноэкранном режиме? Неужели я неправильно создал мои горячие клавиши?

Этот пример демонстрирует проблему:

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self._fullscreen = False
        self.movie_display = QVideoWidget(self)
        self.movie_handler = QMediaPlayer()
        self.movie_handler.setVideoOutput(self.movie_display)
        layout = QVBoxLayout()
        layout.addWidget(self.movie_display)
        self.setLayout(layout)
        QShortcut(QKeySequence(QtConsts.Key_F), self, self.toggle_fullscreen)
        s = 'test.webm'
        s = os.path.join(os.path.dirname(__file__), s)
        local = QUrl.fromLocalFile(s)
        media = QMediaContent(local)
        self.movie_handler.setMedia(media)
        self.movie_handler.play()

    def toggle_fullscreen(self):
        self._fullscreen = not self._fullscreen
        self.movie_display.setFullScreen(self._fullscreen)

1 Ответ

2 голосов
/ 28 февраля 2020

Проблема заключается в том, что ярлык установлен в окне, но при установке в полноэкранном режиме в QVideoWidget 2 windows создаются: исходное окно и окно, в котором QVideoWidget находится в полноэкранном режиме. Одно из возможных решений - установить QShortcut в QVideoWidget или установить sh, что контекстом QShortcut является Qt::ApplicationShortcut:

import os

from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia, QtMultimediaWidgets

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self._fullscreen = False
        self.movie_display = QtMultimediaWidgets.QVideoWidget()

        self.movie_handler = QtMultimedia.QMediaPlayer(
            self, QtMultimedia.QMediaPlayer.VideoSurface
        )
        self.movie_handler.setVideoOutput(self.movie_display)

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.movie_display)
        QtWidgets.QShortcut(
            QtGui.QKeySequence(QtCore.Qt.Key_F),
            <b>self.movie_display</b>,
            self.toggle_fullscreen,
        )
        # or
        """QtWidgets.QShortcut(
            QtGui.QKeySequence(QtCore.Qt.Key_F),
            self,
            self.toggle_fullscreen,
            <b>context=QtCore.Qt.ApplicationShortcut</b>
        )"""

        file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test.webm")
        media = QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file))
        self.movie_handler.setMedia(media)
        self.movie_handler.play()

    def toggle_fullscreen(self):
        self._fullscreen = not self._fullscreen
        self.movie_display.setFullScreen(self._fullscreen)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...