SIGNAL只在一个函数中发出作用,但在其他函数中却不起作用?

时间:2011-10-27 09:10:44

标签: python qt pyqt signals-slots

我有一个奇怪的问题。我正在编写一个多线程应用程序,并使用SIGNALS将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 个答案:

答案 0 :(得分:1)

我的帖子是正确的。 Thread()和Thread(create = False)之间的区别至关重要。我必须定义一个新方法(一个是self.thread = Thread()而另一个self.diff_thread = Thread(create=False))并连接到不同的插槽以使其工作。