PyQt4在线程中等待来自GUI的用户输入

我有一个线程类“ MyThread”和我的主应用程序,简称为“ Gui”。我想从线程类创建一些对象,但在本示例中,我仅创建了一个对象。线程类完成一些工作,然后向Gui类发出信号,指示需要用户输入(此指示目前仅是更改按钮的文本)。然后线程应等待用户输入(在这种情况下为单击按钮),然后继续执行其操作...


from PyQt4 import QtGui, QtCore

class MyTrhead(QtCore.QThread):

    trigger = QtCore.pyqtSignal(str)


    def run(self):

        print(self.currentThreadId())

        for i in range(0,10):

            print("working ")

            self.trigger.emit("3 + {} = ?".format(i))

            #### WAIT FOR RESULT

            time.sleep(1)



class Gui(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):

        super(Gui, self).__init__(parent)

        self.setupUi(self)

        self.pushButton.clicked.connect(self.btn)


        self.t1 = MyTrhead()

        self.t1.trigger.connect(self.dispaly_message)

        self.t1.start()

        print("thread: {}".format(self.t1.isRunning()))



    @QtCore.pyqtSlot(str)

    def dispaly_message(self, mystr):

        self.pushButton.setText(mystr)


    def btn(self):

        print("Return result to corresponding thread")




if "__main__" == __name__:

    import sys

    app = QtGui.QApplication(sys.argv)

    m = Gui()

    m.show()

    sys.exit(app.exec_())

如何在(多个)线程中等待用户输入?


ibeautiful
浏览 799回答 3
3回答

蛊毒传说

将插槽装饰器更改为,@pyqtSlot( <arguments>)后面跟随代表插槽的功能的相同签名def firstwork(self, <argument variables>)。例如,@pyqtSlot(int, str)意味着该插槽需要2个参数(类型之一int和另一个str)。该时隙装饰属于应类似功能def firstWork(self, x, y)与x作为int和y作为str该信号传输数据块。您还必须更改该插槽接收的信号:mySignal = pyqtSignal(int, str)。

12345678_0001

不确定它在PyQt中的状态如何,是否可以在内部处理,但是在Qt C ++中,当您不清理对象并调用退出线程时,一旦停止应用程序线程被过早破坏,您将收到警告。我也不确定是否将动态分配的QObject(即使它是在C ++下的PyQt)移动到QThread也会使该QThread对象成为父对象。如果不是这种情况,我们会发生内存泄漏(再次-底层C ++在这里讨论)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python