PyQt5 - Return 当前播放来自 QMediaPlaylist currentMedia() 函数的媒体名称

PyQt5 - Return currently playing media name from QMediaPlaylist currentMedia() function

我在函数中有这段代码:

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())

正在打印 returns

<PyQt5.QtMultimedia.QMediaContent object at 0x109458cf8>

并试图在状态栏中显示它 return 错误:

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

如何让程序return将播放列表中当前播放的文件名或歌曲名作为字符串放到状态栏中?对不起,如果这是一个愚蠢的问题,我还在学习 PyQt。

关于你的错误,回溯说明一切:

argument 1 has unexpected type 'QMediaContent'

looking at the documentation我们看到了

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

它期望 QString 或 python 中的 str -> 构建一个字符串:

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

但是等等,他们还有更多!
您知道吗,您不需要 lambda-function 来连接您的函数:

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

还有currentMediaChanged does provide the current QMediaContent - docs:

void QMediaPlayer::currentMediaChanged(const QMediaContent &media)

意味着你可以让你的 songChanged-function 小一点:

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()))

您不必将评估的函数连接到信号,只需连接函数的名称。 currentMediaChanged 信号 returns 当前 QMediaContent,然后你必须使用那个 QMediaContent 并得到 QUrl,然后正如我在 [=15= 中展示的那样] 我们得到以下信息:

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

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