PyQt5: Как установить приоритет для pyqtSignal? - PullRequest
0 голосов
/ 31 марта 2019

1.Справочная информация

Я работаю в Python 3.7.Версия Python Qt Pyqt5 позволяет запускать пользовательские сигналы pyqt.Например:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MyClass(QObject):
    mysignal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.mysignal.connect(self.bar)
        return

    def foo(self):
        self.mysignal.emit("foobar")
        return

    @pyqtSlot
    def bar(self, mystr):
        print("signal received: {0}".format(mystr))
        return


2.Проблема

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

Если вы запускаете сигналы pyqt программно, как в функции foo() выше, вы также помещаете события в эту очередь (Я думаю).Это не должно иметь большого значения, если вы не используете слишком много сигналов Pyqt в короткой серии.Очередь перегружена, и пользовательские события не обрабатываются вовремя.Пользователь видит заблокированный графический интерфейс. Yikes!


3.Решение

Одним из способов решения этой проблемы может быть назначение низких приоритетов программно запущенному сигналу Pyqt.Это возможно?Как?
Если нет - знаете ли вы другие способы решения проблемы?

1 Ответ

0 голосов
/ 01 апреля 2019

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

Итак, в вашем примере вы можете заменить отправьте прямым вызовом self.bar.

Но, если ваш слот слишком длинный, цикл обработки событий должен подождать, прежде чем сможет обрабатывать пользовательские события.

Если ваш пользовательский интерфейс зависает при вызове слота, это означает, что вы должны использовать другой поток, чтобы позволить циклу обработки событий обрабатывать пользовательские события.

...