线程:在GUI线程外使用pixmaps是不安全的

FLX*_*FLX 5 python qt multithreading pyqt qpixmap

我正在构建一个音乐播放器,用SqueezePlay检查状态,SqueezePlay是一个SqueezeBox控制器应用程序.简而言之,我通过使用线程来检查Squeezeplay的状态,持续5秒.如果歌曲标题改变了,我让它更新标签(Qlabel,专辑图片(QPixmap)等等.但是,当我要求它通过线程更新它时,我得到在GUI线程之外使用pixmaps是不安全的.

如何进行线程处理但仍设置QPixmap?

示例代码:

#self.sq.getArtwork() returns variable with the image
coverArt = self.sq.getArtwork()
coverPixMap = QtGui.QPixmap()
coverPixMap.loadFromData(coverArt)
self.albumArt.setPixmap(coverPixMap)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

更新: 我尝试了以下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)
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 7

所有图形化Qt操作都应该在主线程中进行.其他线程实际上不允许调用Qt图形操作(包括可能是pixmaps).

他们可以向主线程发出Qt信号.或者简单地(在Linux上)写入管道,并让主线程等待该管道上的输入.

当然,您必须定义所需的信号(以及插槽).在C++代码中,您需要使用signals:(或slots:)标记它们,并且您的C++代码应由moc处理.我不知道什么是Python对应物(也许python反射能力可能就足够了,我真的不知道).然后,您必须使用排队连接将信号连接到插槽.我不知道如何在Python中这样做.