如何在pyqt5 paintEvent中添加参数?

时间:2019-05-21 17:33:48

标签: python python-3.x pyqt5 python-multiprocessing

在paintEvent内部运行的函数需要将multiprocessing.Queue对象传递给自身。

我尝试使用全局python列表,但是列表不适用于多处理库。在代码的“主要”部分,我创建了一个multiprocess.Queue对象。函数drawMandelbrot是我的QWidget类的一部分,由paintEvent执行。每当需要在屏幕上绘制gui窗口时,paint事件就会运行。但是功能drawMandelbrot需要访问Queue对象以获取需要绘制的数据。

if __name__ == '__main__':
    procQueue = Queue()
    app = QApplication([])
    #Called whenever the window is resized or brought into focus
    def paintEvent(self, event, procQueue):
        qp = QPainter()
        qp.begin(self)

        #Run the drawMandelbrot program
        self.drawMandelbrot(qp, procQueue)
        qp.end()

我希望该函数将Queue对象传递给drawMandelbrot函数。程序运行时,出现错误“ TypeError:paintEvent()缺少1个必需的位置参数:'Queue'”。如何允许drawMandelbrot函数访问在python应用程序的“主要”部分中创建的Queue对象?

1 个答案:

答案 0 :(得分:0)

您无法修改所继承类的方法的签名,因此在这些情况下,解决方案是将变量传递给类的属性:

class FooWidget(QWidget):
    def __init__(self, q, parent=None):
        super(FooWidget, self).__init__(parent)
        self.m_q = q

    def paintEvent(self, event):
        painter = QPainter(self)
        self.drawMandelbrot(painter, self.m_q)

    def drawMandelbrot(sef, painter, q):
        # ... some code


if __name__ == '__main__':
    procQueue = Queue()
    app = QApplication([])
    w = FooWidget(procQueue)
    # ...

另一方面,由于Qt不支持多处理,因此只能在主进程的主线程中执行paintEvent(显然是drawMandelbrot),并且必须在作为主线程的GUI线程中执行GUI。