PyQt5 - возвращает имя воспроизводимого в данный момент мультимедиа из функции QMediaPlaylist currentMedia().

У меня есть этот код в функции:

self.playlist.currentMediaChanged.connect(lambda: self.songChanged())

и он вызывает эту функцию:

def songChanged(self):
    if self.playlist.mediaCount != 0:
        print(QMediaContent(self.playlist.currentMedia()))
        self.statusBar().showMessage(self.playlist.currentMedia())

Печать возвращает

<PyQt5.QtMultimedia.QMediaContent object at 0x109458cf8>

И попытка показать это в строке состояния возвращает ошибку:

TypeError: showMessage(self, str, msecs: int = 0): argument 1 has unexpected type 'QMediaContent'

Как я могу заставить программу возвращать имя воспроизводимого в данный момент файла или название песни в списке воспроизведения в виде строки, которую нужно поместить в строку состояния? Извините, если это глупый вопрос, я все еще изучаю PyQt.

2 ответа

Решение

Вам не нужно подключать функцию, оцениваемую к сигналу, только имя функции. currentMediaChanged сигнал возвращает ток QMediaContentтогда вы должны использовать это QMediaContent и получить QUrlи затем, как я показал в моем предыдущем ответе, мы получаем следующее:

    self.playlist.currentMediaChanged.connect(self.songChanged)

def songChanged(self, media):
    if not media.isNull():
        url = media.canonicalUrl()
        self.statusBar().showMessage(url.fileName())

Относительно вашей ошибки трассировка говорит все:

Аргумент 1 имеет неожиданный тип 'QMediaContent'

глядя на документацию, которую мы видим

void QStatusBar::showMessage(const QString &message, int timeout = 0)

что он ожидает QString или просто str в Python -> построить строку:

self.statusBar().showMessage(str(self.playlist.currentMedia()))

но подождите, их больше!
Знаете ли вы, что вам не нужна лямбда-функция для подключения вашей функции:

self.playlist.currentMediaChanged.connect(self.songChanged) # <- no brackets

также currentMediaChanged действительно обеспечивает текущий QMediaContent - документы:

void QMediaPlayer::currentMediaChanged(const QMediaContent &media)

это означает, что вы можете сделать свой songChanged -функция немного меньше:

def songChanged(self, media):
  if media:
    print(media)
    self.statusBar().showMessage(str(media))

чтобы получить имя файла из объекта, который вы можете использовать: media.canonicalUrl().fileName()

 print(media.canonicalUrl().fileName())
 self.statusBar().showMessage(str(media.canonicalUrl().fileName()))
Другие вопросы по тегам