我正在构建一个音乐播放器,它使用 SqueezePlay(一个 SqueezeBox 控制器应用程序)检查状态。长话短说,我使用线程每 5 秒检查一次 Squeezeplay 的状态。如果歌曲标题发生变化,我让它更新标签(Qlabel、专辑封面(QPixmap)等)。但是,当我要求它通过线程更新它时,我得到在 GUI 线程之外使用像素图是不安全的 .
我如何进行线程处理但仍然设置 QPixmap?
示例代码:
#self.sq.getArtwork() returns variable with the image
coverArt = self.sq.getArtwork()
coverPixMap = QtGui.QPixmap()
coverPixMap.loadFromData(coverArt)
self.albumArt.setPixmap(coverPixMap)
非常感谢!
Update:我用 Emit 尝试了以下操作,但它不起作用,有人可以看看我做错了什么吗?
def setNewArtwork(self, image):
coverPixMap = QtGui.QPixmap()
coverPixMap.convertFromImage(image)
icon = QtGui.QIcon(coverPixMap)
item.setIcon(icon)
def getNewArtwork(self):
coverArt = self.sq.getArtwork()
icon = QtGui.QImage(coverArt)
self.emit(QtCore.SIGNAL('setNewArtwork(QImage)'), icon)
所有图形 Qt 操作都应该发生在主线程中。其他线程实际上不允许调用 Qt 图形操作(可能包括像素图)。
他们可以发出 Qt 信号 http://doc.qt.io/qt-4.8/signalsandslots.html到主线程。或者简单地(在 Linux 上)写入管道,并拥有 mainthread http://qt-project.org/wiki/ThreadsEventsQObjects等待该管道上的输入。
当然,您必须定义所需的信号(以及插槽)。在 C++ 代码中,您需要将它们标记为signals:
(or slots:
)并且您的 C++ 代码应该由moc http://doc.qt.io/qt-4.8/moc.html#moc。我不知道Python的对应部分是什么(也许Python反射能力可能就足够了,我真的不知道)。然后,您必须将信号连接到插槽,并使用queued联系。我不知道如何在 Python 中做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)