PyQt5从QMediaPlaylist currentMedia()函数返回当前正在播放的媒体名称

2024-06-28 20:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在函数中有以下代码:

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

它调用这个函数:

^{pr2}$

打印它返回

<PyQt5.QtMultimedia.QMediaContent object at 0x109458cf8>

试图在状态栏中显示它会返回一个错误:

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

如何让程序返回播放列表中当前播放的文件名或歌曲标题作为字符串放入状态栏?抱歉,如果这是个愚蠢的问题,我还在学习PyQt。在


Tags: lambda函数代码selfobjectconnectplaylistpyqt5
2条回答

不必将计算的函数连接到信号,只需将函数的名称连接起来。currentMediaChanged信号返回电流QMediaContent,然后必须使用QMediaContent并得到QUrl,然后如我在previous answer中所示,我们得到以下结果:

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

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

关于你的错误,回溯表明:

argument 1 has unexpected type 'QMediaContent'

looking at the documentation我们看到了 在

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

它期望在python中使用QString或仅仅是str来构建一个字符串:

^{pr2}$

但是等一下,他们是更多的!
您知道不需要lambda函数来连接函数:

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

还有^{} does provide the current ^{} - docs

void QMediaPlayer::currentMediaChanged(const QMediaContent &media)

这意味着您可以将您的songChanged-函数缩小一点:

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

{6}你可以从文件名中得到

 print(media.canonicalUrl().fileName())
 self.statusBar().showMessage(str(media.canonicalUrl().fileName()))

相关问题 更多 >