【问题标题】:Error with thread in pyqt4pyqt4中的线程错误
【发布时间】:2015-07-12 05:29:44
【问题描述】:

我有问题。我制作了线程,然后我想从那里打开新窗口。但它不起作用。

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_())

它不是显示新窗口。哪里出错了?

【问题讨论】:

    标签: python multithreading pyqt pyqt4


    【解决方案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()
    

    【讨论】:

    • 但是新窗口也没有打开。
    • @Q-bart。您需要保留对窗口的引用(请参阅我更新的答案)。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多