针对类实现QProgressBar

2024-07-01 08:37:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的PyQt程序有两个小部件(选择文件等),然后是一个显示解析文件结果的主窗口。在

这个程序对于小的示例文件非常有用,但是当试图解析较大的文件时,它会挂起(显示“没有响应”),然后在大约30秒后显示结果。在

我想在主窗口打开之前实现一个QDialog。QDialog将有一个进度条,让用户知道主窗口何时打开。在

此进度条需要设置为主窗口弹出前的时间长度。在

实现这一点的最佳方法是什么?我看到了一些例子,但是进度条只是设置为一个标准化的时间,而不是在处理(解析)完成时。在

我目前有以下代码打开主窗口。在

def openWidgetMain(self):
        self.WidgetMain = WidgetMain()
        self.WidgetMain.show()
        self.close()

此窗口的所有处理都在打开时完成。那么如何连接QProgressBar呢?在


Tags: 文件方法代码进度条用户self程序示例
2条回答

把你持久的过程放在某种程度上。读这个:http://qt-project.org/doc/qt-5/threads-technologies.html 从该线程发出一个信号来更新进度条。这样应用程序就不会挂起,用户可以看到进度。在

但是,在进度条中显示哪个百分比取决于加载例程。如果你不能计算一个确切的百分比,试着做一些估计(例如,根据文件的大小和文件的处理量)。在

首先,实现这一点的最佳方法是,必须估计加载进度文件。接下来,用QtCore.QThread来实现它来创建后台进程。最后,将您的回拨进度放入QtGui.QMainWindow。在

小例子

import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore

class QCustomThread (QtCore.QThread):
    startLoad    = QtCore.pyqtSignal(int)
    progressLoad = QtCore.pyqtSignal(int)
    statusLoad   = QtCore.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 (QtGui.QMainWindow):
    def __init__ (self):
        super(QCustomMainWindow, self).__init__()
        # Create action with QPushButton
        self.startQPushButton = QtGui.QPushButton('START')
        self.startQPushButton.released.connect(self.startWork)
        self.setCentralWidget(self.startQPushButton)
        # Create QProgressDialog
        self.loadingQProgressDialog = QtGui.QProgressDialog(self)
        self.loadingQProgressDialog.setLabelText('Loading')
        self.loadingQProgressDialog.setCancelButtonText('Cancel')
        self.loadingQProgressDialog.setWindowModality(QtCore.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 'FAILED'
        myQCustomThread.startLoad.connect(startLoadCallBack)
        myQCustomThread.progressLoad.connect(progressLoadCallBack)
        myQCustomThread.statusLoad.connect(statusLoadCallBack)
        self.loadingQProgressDialog.canceled.connect(myQCustomThread.cancel)
        myQCustomThread.start()

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

^{}的更多信息(建议阅读以了解行为)

相关问题 更多 >

    热门问题