栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在PyQt中使用QThread的正确方法示例?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在PyQt中使用QThread的正确方法示例?

这是一个单独的工作线程的工作示例,该工作线程可以发送和接收信号以使其与GUI通信。

我做了两个简单的按钮,一个按钮在一个单独的线程中开始长时间的计算,另一个按钮立即终止计算并重置工作线程。

通常,强行终止线程并不是执行此操作的最佳方法,但是在某些情况下,始终不能正常退出是不可行的。

from PyQt4 import QtGui, QtCoreimport sysimport randomclass Example(QtCore.QObject):    signalStatus = QtCore.pyqtSignal(str)    def __init__(self, parent=None):        super(self.__class__, self).__init__(parent)        # Create a gui object.        self.gui = Window()        # Create a new worker thread.        self.createWorkerThread()        # Make any cross object connections.        self._connectSignals()        self.gui.show()    def _connectSignals(self):        self.gui.button_cancel.clicked.connect(self.forceWorkerReset)        self.signalStatus.connect(self.gui.updateStatus)        self.parent().aboutToQuit.connect(self.forceWorkerQuit)    def createWorkerThread(self):        # Setup the worker object and the worker_thread.        self.worker = WorkerObject()        self.worker_thread = QtCore.QThread()        self.worker.moveToThread(self.worker_thread)        self.worker_thread.start()        # Connect any worker signals        self.worker.signalStatus.connect(self.gui.updateStatus)        self.gui.button_start.clicked.connect(self.worker.startWork)    def forceWorkerReset(self):   if self.worker_thread.isRunning(): print('Terminating thread.') self.worker_thread.terminate() print('Waiting for thread termination.') self.worker_thread.wait() self.signalStatus.emit('Idle.') print('building new working object.') self.createWorkerThread()    def forceWorkerQuit(self):        if self.worker_thread.isRunning(): self.worker_thread.terminate() self.worker_thread.wait()class WorkerObject(QtCore.QObject):    signalStatus = QtCore.pyqtSignal(str)    def __init__(self, parent=None):        super(self.__class__, self).__init__(parent)    @QtCore.pyqtSlot() def startWork(self):        for ii in range(7): number = random.randint(0,5000**ii) self.signalStatus.emit('Iteration: {}, Factoring: {}'.format(ii, number)) factors = self.primeFactors(number) print('Number: ', number, 'Factors: ', factors)        self.signalStatus.emit('Idle.')    def primeFactors(self, n):        i = 2        factors = []        while i * i <= n: if n % i:     i += 1 else:     n //= i     factors.append(i)        if n > 1: factors.append(n)        return factorsclass Window(QtGui.QWidget):    def __init__(self):        QtGui.QWidget.__init__(self)        self.button_start = QtGui.QPushButton('Start', self)        self.button_cancel = QtGui.QPushButton('Cancel', self)        self.label_status = QtGui.QLabel('', self)        layout = QtGui.QVBoxLayout(self)        layout.addWidget(self.button_start)        layout.addWidget(self.button_cancel)        layout.addWidget(self.label_status)        self.setFixedSize(400, 200)    @QtCore.pyqtSlot(str)    def updateStatus(self, status):        self.label_status.setText(status)if __name__=='__main__':    app = QtGui.QApplication(sys.argv)    example = Example(app)    sys.exit(app.exec_())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号