【问题标题】:Sending a signal from main function to a thread?从主函数向线程发送信号?
【发布时间】:2014-10-10 06:55:07
【问题描述】:

我正在使用 Pyqt4 在 python 中制作 GUI。我想从主 GUI 向线程发送信号以创建函数。我知道如何将信号从线程发送到主 GUI,但我不知道相反的事情。我也想用信号传递一个变量。

类似:

class MainGUI()
     def function
         value = 5
         self.emit(QtCore.Signal("Signal(int)"),value)


class thread(QtCore.QThread)
     def _init_(self)
          Qtcore.QThread._init_()
          self.connect(Qt.SIGNAL("Signal(int)"),self.run())

     def run(self,value):
         time.sleep(value)

因此,每次从主 GUI 传输信号时,我都希望在线程中并行运行该函数,而不会冻结 GUI。

任何帮助将不胜感激, 喷射

【问题讨论】:

    标签: python multithreading qt


    【解决方案1】:

    正确的方法是创建将被移动到线程的对象。你不需要继承QtCore.QThread

    或多或少是这样的(免责声明:我比 Python 更喜欢 C++):

    myThread = QtCore.QThread()
    testObject = YourClassWithSlots() # NO PARENT HERE
    testObject.moveToThread(myThread)
    myThread.start()
    

    从那时起,testObject(具有默认连接类型)的所有已连接插槽将在线程 myThread 中运行。

    有用的链接:


    更多细节请@Ezee

    class YourClassWithSlots(QtCore.QObject) :
        @Slot(int)
        def havyTaskMethod(self, value) :
             # long runing havy task
             time.sleep(value)
    
    self.myThread = QtCore.QThread(self)
    self.testObject = YourClassWithSlots() # NO PARENT HERE
    self.testObject.moveToThread(myThread) # this makes slots to be run in specified thread
    self.myThread.start()
    self.connect(Qt.SIGNAL("Signal(int)"), self.testObject.havyTaskMethod)
    

    【讨论】:

    • 问题是关于发送信号而不是关于使用线程。所以这不是一个答案。在这种情况下,OP 的下一个问题是“如何从移动到另一个线程的对象发送信号”
    • 在投票之前阅读我给出的链接。看来你喜欢复仇。请注意,即使在编辑之后,您的答案也很糟糕。 @Jetmir 应该了解信号和插槽的功能(您也应该了解),那么他的问题将很容易解决。
    • 链接可以提供更多信息,但不能提供答案。添加一些回答 OP 问题的内容,投票将被删除。想想也更有礼貌。
    • 这里有更多详细信息。
    • 你不需要从QThread继承YourClassWithSlots
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多