我正在使用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。

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

最佳答案

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

或多或少像这样(免责声明:我比Python多C ++):

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


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

有用的链接:


http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/
http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
http://doc.qt.io/qt-5/qobject.html#moveToThread




更多详细信息,请@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)

10-08 05:20
查看更多