2014-08-30 2 views
0

В моей программе PyQt есть 2 виджета (выбор файлов и т. Д.), А затем главное окно, которое отображает результаты проанализированных файлов.Реализация QProgressBar для класса

Программа отлично подходит для небольших файлов с образцами, но при попытке проанализировать большие файлы она будет висеть (отображать «Не реагировать»), а затем показывать результаты примерно через 30 секунд или около того.

Я хотел бы реализовать QDialog перед тем, как откроется главное окно. QDialog будет иметь индикатор выполнения, чтобы сообщить пользователю, когда откроется главное окно.

Этот индикатор выполнения должен быть установлен в течение времени до появления главного окна.

Каков наилучший способ реализации этого? Я видел несколько примеров, но индикатор выполнения просто установлен в стандартное время, а не когда обработка (синтаксический анализ) завершена.

В настоящее время у меня есть следующий код, который открывает главное окно.

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

Вся обработка этого окна выполняется при его открытии. Итак, как мне подключить QProgressBar?

ответ

0

Во-первых, лучший способ реализовать это, вы должны оценить свой файл прогресса загрузки. Затем выполните его с помощью 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_()) 

Больше информации о QtCore.QThread (Рекомендую прочитать, чтобы понять поведение)

+1

Спасибо. Будет прочитан класс QThread сейчас – MPythonLearner

1

Положите свой длительный процесс в какую-то нить. Прочтите следующее: http://qt-project.org/doc/qt-5/threads-technologies.html Извлеките сигнал из этого потока, чтобы обновить индикатор выполнения. Таким образом ваше приложение не будет висеть, и пользователь увидит прогресс.

Однако это зависит от вашей загрузочной процедуры, чтобы определить, какой процент отображать в индикаторе выполнения. Если вы не можете рассчитать точный процент, попробуйте какую-то оценку (например, на основе размера файла или обработанного количества файла).

Смежные вопросы