QPixmap在GUI线程外不安全

时间:2015-03-08 10:38:42

标签: python multithreading qpixmap

我的程序有主要的GUI线程来处理用户界面。

另一个线程开始处理艰苦的工作(循环,计算等)而不冻结主GUI。

来自我的"计算线程"我正在使用另一个模块draw_plots,它只能绘制和保存多种图形。

import draw_plots as plots
    class calculatorThread(QtCore.QThread):
        signal1 = QtCore.pyqtSignal(int, int)
        signal2 = QtCore.pyqtSignal(int,int) 
        signal3 = QtCore.pyqtSignal(int) 

        def __init__(self,input_file_txt, parameter_file_txt):
            QtCore.QThread.__init__(self)
            #and etc etc

在这个帖子的某个时刻我打电话:

plots.stacked_barplot(*arguments)

一切正常,但是,我在屏幕上多次收到消息:

QPixmap: It is not safe to use pixmaps outside the GUI thread

想知道我做错了什么,以及如何避免这条消息。

2 个答案:

答案 0 :(得分:1)

好吧,你从计算器线程发出plot命令,然后使用QPixmap绘制绘图 - 所有这些都来自你的计算器线程。

理想情况下,您不应该使用计算器线程,而是发出一个你已经准备好进行绘图的信号 - 并在主线程中进行绘图。也许沿着以下几点:

class calculatorThread(QtCore.QThread):
    plot_emit = QtCore.pyqtSignal()

    def run(self):
        self.plot_args = your_calculation()
        self.plot_ready.emit()

外部,将plot_ready信号连接到您的绘图命令:

calculator.plot_emit.connect(lambda x: 
                             plots.stacked_barplot(*calculator.plot_args))

答案 1 :(得分:1)

如果在单独的线程中完成计算,则应使用QImage。您还可以安全地访问QImage.bits()并直接处理像素数据(更快)。

由于警告明确说明,QPixmap对象只能在GUI线程中使用。如果您确实需要QImage,则可以将计算出的QPixmap转换为QPixmap(但您可以直接在QImage上绘制QPainter)。