2015-05-02 2 views
0

У меня проблема. Я сделал нить, и оттуда я хочу открыть новое окно. Но это не работает.Ошибка с нитью в pyqt4

import sys 
from grab import Grab 
from PyQt4 import QtGui, QtCore 
class Requests(QtCore.QThread): 
    def __init__(self, parent=None): 
     QtCore.QThread.__init__(self, parent) 

    def run(self): 
     # here some comands 
     self.emit(QtCore.SIGNAL("mysignal(QString)"), 'open') 

class window(QtGui.QWidget): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self, parent) 

     self.setGeometry(100, 100, 500, 200) 
     self.setWindowTitle('Window') 
     self.label = QtGui.QLabel(u'Hello') 
     self.Layout = QtGui.QVBoxLayout() 
     self.Layout.addWidget(self.label) 
     self.setLayout(self.Layout) 

     self.c = Requests() 
     self.c.start() 
     self.connect(self.c, QtCore.SIGNAL("mysignal(QString)"), self.open_window, QtCore.Qt.QueuedConnection) 

    def open_window(self): 
     print 'open modal window' 
     modal_w = popup_window() 
     modal_w.show() 

app = QtGui.QApplication(sys.argv) 
main = window() 
main.show() 
sys.exit(app.exec_()) 

Не отображается новое окно. Где ошибка?

ответ

1

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

class Requests(QtCore.QThread):  
    def run(self): 
     # do some work... 
     print 'work finished' 

    ... 
    self.c = Requests() 
    self.c.finished.connect(self.open_window) 
    self.c.start() 

Кроме того, необходимо сохранить ссылку на диалог при его открытии в слоте:

def open_window(self): 
     print 'open modal window' 
     self.modal_w = popup_window() 
     self.modal_w.show() 
+0

Но новое окно также не открыто. –

+1

@ Q-bart. Вам нужно сохранить ссылку на окно (см. Мой обновленный ответ). – ekhumoro

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