Как добавить аргумент в pyqt5 paintEvent? - PullRequest
0 голосов
/ 21 мая 2019

Функция, которая запускается внутри paintEvent, нуждается в мультипроцессорном объекте. Вопрос, который необходимо передать в себя.

Я пытался использовать глобальные списки Python, но списки не работают с многопроцессорной библиотекой. В разделе «main» моего кода я создаю объект multiprocess.Queue. Функция drawMandelbrot является частью моего класса QWidget и выполняется paintEvent. Событие рисования запускается всякий раз, когда на экране необходимо нарисовать окно графического интерфейса. Но функция 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 обязательный позиционный аргумент:« Очередь ». Как мне разрешить функции drawMandelbrot иметь доступ к объекту Queue, который я создал в своем «главном» разделе приложения python?

1 Ответ

0 голосов
/ 23 мая 2019

Вы не можете изменить сигнатуру методов класса, который наследуется, поэтому решение в этих случаях заключается в передаче переменной через атрибут класса:

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)
    # ...

С другой стороны, paintEvent (и, очевидно, drawMandelbrot) может выполняться только в главном потоке основного процесса, так как Qt не поддерживает многопроцессорность, а GUI должен выполняться в потоке GUI, который является основным потоком.

...