在PyQt中使用QTimer vs Timer

问题描述

我正在设法在GUI应用程序中用Qtimer在PyQt中使用线程进行工作。对于这样一个基础性的问题表示歉意,但是我搜索了其他类似的问题,但未能找到翔实的答案。

我正在寻求从一系列传感器中收集数据,并根据结果处理对控制结构的更改。不需要用户交互。但是,有一个控制面板和一系列状态指示器,旨在在其运行时显示。我在其他问题和示例中指出,那些使用常规time.sleep()函数的对象通常被定向为使用QTimer。

在进一步的挖掘中,我发现使用time.sleep()可以正常工作的附加代码示例。作为一个对象练习,我试图用各种QTimer调用来代替它,但都无效。

我还发现了一些引用,指出QTimer只能在QCoreApplication或类似的内部运行。但是首先使用Qtimer的原因是QApplication正在运行以支持GUI。没有它,我们将无法访问任何小部件。而且如果没有GUI,我们将不需要QTimer并可以使用time.sleep(),对吗?

我在这里想念什么?当很多其他示例似乎需要QTimer时,为什么这段代码似乎可以与time.sleep()一起正常工作?如果使用QTimer,在QApplication中如何发生?

#!/usr/bin/python3
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import RPi.GPIO as GPIO
import time
import datetime
import sys

class QCustomThread (QThread):
    startLoad    = pyqtSignal(int)
    progressLoad = pyqtSignal(int)
    statusLoad   = pyqtSignal(bool)

    def __init__ (self,parentQWidget = None):
        super(QCustomThread,self).__init__(parentQWidget)
        self.wasCanceled = False

    def run (self):
        # Simulate data load estimation
        numberOfprogress = 100
        self.startLoad.emit(numberOfprogress)
        for progress in range(numberOfprogress + 1):
            # Delay
            time.sleep(0.1)
            if not self.wasCanceled:
                self.progressLoad.emit(progress)
            else:
                break
        self.statusLoad.emit(True if progress == numberOfprogress else False)
        self.exit(0)

    def cancel (self):
        self.wasCanceled = True

class QCustomMainWindow (QMainWindow):
    def __init__ (self):
        super(QCustomMainWindow,self).__init__()
        # Create action with QPushButton
        self.startQPushButton = QPushButton('START')
        self.startQPushButton.released.connect(self.startWork)
        self.setCentralWidget(self.startQPushButton)
        # Create QProgressDialog
        self.loadingQProgressDialog = QProgressDialog(self)
        self.loadingQProgressDialog.setLabelText('Loading')
        self.loadingQProgressDialog.setCancelButtonText('Cancel')
        self.loadingQProgressDialog.setWindowModality(Qt.WindowModal)

    def startWork (self):
        myQCustomThread = QCustomThread(self)
        def startLoadCallBack (numberOfprogress):
            self.loadingQProgressDialog.setMinimum(0)
            self.loadingQProgressDialog.setMaximum(numberOfprogress)
            self.loadingQProgressDialog.show()
        def progressLoadCallBack (progress):
            self.loadingQProgressDialog.setValue(progress)
        def statusLoadCallBack (flag):
            print ('SUCCESSFUL') if flag else print ('FAILED')
        myQCustomThread.startLoad.connect(startLoadCallBack)
        myQCustomThread.progressLoad.connect(progressLoadCallBack)
        myQCustomThread.statusLoad.connect(statusLoadCallBack)
        self.loadingQProgressDialog.canceled.connect(myQCustomThread.cancel)
        myQCustomThread.start()

myQApplication = QApplication(sys.argv)
myQCustomMainWindow = QCustomMainWindow()
myQCustomMainWindow.show()
sys.exit(myQApplication.exec_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)