问题描述
我正在设法在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 (将#修改为@)