#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)
) и подключиться к разным слотам, чтобы заставить его работать.