QPixmap在GUI线程外不安全

2024-04-25 22:17:41 发布

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

我的程序有主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

在这条线索的某一点上,我呼吁:

^{pr2}$

一切都很好,但是,我在屏幕上多次看到一条信息:

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

想知道我做错了什么,如何避免这个信息。在


Tags: self程序txt信息initetcgui线程
2条回答

好吧,您可以从计算器线程发出plot命令,该命令反过来使用QPixmap绘制绘图-所有这些都是从计算器线程内部进行的。在

理想情况下,你不应该从计算器线程中绘图,而是发出一个信号,表明你已经准备好绘图了——然后在主线程中绘制。或许可以按照以下思路:

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

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

在外面,将plot_ready信号连接到plot命令:

^{pr2}$

如果计算是在单独的线程中完成的,则应该使用QImage。您还可以安全地访问QImage.bits(),并直接对像素数据进行图像处理(速度快得多)。在

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

相关问题 更多 >