ИЗЛУЧЕНИЕ сигнала работает только в одной функции, но не в других?

#python #qt #pyqt #signals-slots

#python #qt #pyqt #сигналы-слоты

Вопрос:

У меня несколько странная проблема. Я кодирую многопоточное приложение и использую СИГНАЛЫ для передачи данных QThread в данные класса GUI. Без лишних слов, вот упрощенный код.

 class GUI(uiMainWindow.MainWindow):
    def __init__(self, parent=None):
        super etc
        self.thread = Thread()
        self.connect(self.thread, SIGNAL("changeStatus(QString)"), self.setStatus, Qt.QueuedConnection)

    def setStatus(self, status):
        self.statusBar.setText(status)


class Thread(QThread):
    def __init__(self, parent=None, create=True):
        super etc
        self.create = create

    def run(self):
        if self.create:
            create_data()
        if not self.create:
            upload_data()

    def create_data(self):
        self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text")
        #rest of the code

    def upload_data(self):
        self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text")
  

Довольно просто, не так ли? Однако вот в чем проблема: self.emit работает только в функции create_data, но не в upload_data (или, если на то пошло, в любой другой функции; я тоже пытался ее вставить __init__ ). Я попытался ввести print "I got the status" status функцию setStatus. Опять же, это работает в функции create_data(), но не в функции upload_data() .

Различия между двумя функциями относительно незначительны, и, насколько я могу судить, ничто не мешает функции self.emit — фактически, в обоих случаях self.emit находится всего в 4-5 строках «от» определения функции.

Это действительно озадачивает меня. Любая помощь? Заранее спасибо!

РЕДАКТИРОВАТЬ: опять же, насколько я могу судить, единственная разница между двумя функциями заключается в run() — первая вызывается, если параметр create имеет значение True , а вторая — если оно равно False .

Комментарии:

1. Кроме лишнего (QString) в сигнатуре сигнала, в опубликованном вами примере кода нет ничего плохого. Пожалуйста, опубликуйте полный, работоспособный пример, демонстрирующий проблему.

2. @ekhumoro: Хотел бы я это сделать, но программа с закрытым исходным кодом: (Так вы говорите, что QString совершенно не нужен? Должен ли я просто оставить его пустым (т. Е. changeStatus() )?

3. Если вы используете синтаксис старого стиля и подключаете сигнал python к вызываемому python, тогда требуется только имя (например changeState ). Смотрите Здесь различные возможности. Конечно, для новых проектов гораздо лучше использовать синтаксис нового стиля .

4. Я собирался переключиться на сигналы нового стиля, но у меня истекают сроки. Возможно, в версии 2 приложения. Спасибо за совет, я ценю это.

Ответ №1:

Я был прав в своем посте. Разница между Thread() и Thread(create=False) имела решающее значение. Мне пришлось определить новый метод (один был self.thread = Thread() и другой self.diff_thread = Thread(create=False) ) и подключиться к разным слотам, чтобы заставить его работать.