2014-02-02 3 views
2

Когда я пытаюсь использовать один объект QDialog из потоков, я получаю эту ошибку. Вот код, я использую:Не удается отправить отправленные события для объектов в другом потоке

import threading 
import test_qdialog 
from PyQt4 import QtGui, QtCore 


class MyThread(threading.Thread): 
    def __init__(self, id, window, mutex): 
     self.id = id 
     self.window = window 
     self.mutex = mutex 
     super(MyThread, self).__init__() 

    def run(self): 
     with self.mutex: 
      result = self.window.exec_() 
      if result == QtGui.QDialog.Accepted: 
       print "Thread %d: %s" % (self.id, self.window.message_input.text()) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 

    mutex = threading.Lock() 
    threads = [] 
    window = test_qdialog.MyDialog() 

    for i in range(5): 
     thread = MyThread(i, window, mutex) 
     thread.start() 
     threads.append(thread) 

    for thread in threads: 
     thread.join() 

    sys.exit(app.exec_()) 

Как написано в this ответ, если я это правильно, я не могу сделать это таким образом. Но как я могу это сделать?

+2

На самом деле виджеты Qt не являются потокобезопасными. – fasked

+0

@fasked, и нет обходного пути? –

+0

Не существует юридического решения. В документации Qt явно говорится, что доступ к виджетам возможен только из основного потока. – fasked

ответ

2

Вы можете создавать и использовать виджеты GUI в основном потоке (каждая библиотека пользовательского интерфейса, которую я знаю, такая). Однако вы можете легко передавать сигналы из потоков в основной, используя QtCore.QtThread. См. Например, ответ на вопрос PyQt threads and signals - how to properly retrieve values (даже если ответ не тот, который ищет ОП, он имеет отношение к вашей ситуации). Также можно найти this SO post.

Таким образом, вместо того, чтобы создавать или получать доступ к диалоговому потоку из потока, вы должны выпустить сигнал из потока и подключить к нему свое главное окно, создавая диалог, когда он получает сигнал. Qt заботится о передаче данных между потоками. Будет работать как шарм.

Определенно внимательно посмотреть на Qt Threading Basics, если вы уже не имеете (если у вас есть, может задать вопросы о части вы не понимаете, есть тонн важной информации там).

+0

На самом деле, я создаю диалог в основном потоке. Проблема в том, что я пытаюсь получить к нему доступ из другого потока. Спасибо за информацию для чтения. –

+0

@DmitryMikhaylov Я бы также рекомендовал прочитать это: http://qt-project.org/doc/qt-4.8/threads-qobject.html –

+0

@DmitryMikhaylov Я имел в виду создание или использование той же проблемы. Я отредактировал. – Schollii

Смежные вопросы