启动屏幕从UI对话框导入被阻止



我做了一个大型应用程序,在主应用程序中导入了大量对话框(主循环(。这些对话框导入的时间很长,所以我制作了一个plash屏幕,但是当然在主循环从长时间的导入中被阻止。我认为我无法获得的是,我无法在主循环中移动导入,因为我会从创建UI的类中收到一个错误,而从解释器检查代码时,巫婆运行。这里的示例代码:

from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
from PyQt5.QtWidgets import QDialog,QWidget,QApplication, QInputDialog, QLineEdit, QFileDialog,QProgressDialog, QMainWindow, QFrame,QSplashScreen
from PyQt5.QtCore import QThread , pyqtSignal,Qt
from PyQt5.QtGui import QIcon,QPainter,QPixmap

#here the slow import dialogs
from ui import Ui_MainWindow,HoverButton
from dialog1 import Ui_Dialog
from dialog2 import Ui_Dialog2
from dialog3 import Ui_dialog3
from dialog4 import Ui_Dialog4
from dialog5 import Ui_dialog5
from dialog6 import Ui_dialog6
#....... and so on


###after class methods###
class Dialog1(QtWidgets.QDialog,Ui_Dialog):                                #fuel button prompt dialog for inputs
    def __init__(self,parent=None):
        super(Dialog1, self).__init__(parent)
        self.setupUi(self)
class Dialog2(QtWidgets.QDialog,Ui_Dialog2):                               #all errors dialog
    def __init__(self,parent=None):
        super(Dialog2, self).__init__(parent)
        self.setupUi(self)
class Dialog3(QtWidgets.QDialog,Ui_dialog3):                               #that might take a while dialog
    def __init__(self,parent=None):
        super(Dialog3, self).__init__(parent)
        self.setupUi(self)
class Dialog4(QtWidgets.QDialog,Ui_Dialog4):                               #input gross weight dialog
    def __init__(self,parent=None):
        super(Dialog4, self).__init__(parent)
        self.setupUi(self)
class Dialog5(QtWidgets.QDialog,Ui_dialog5):                               #map viewer specifications dialog
    def __init__(self,parent=None):
        super(Dialog5, self).__init__(parent)
        self.setupUi(self)
#etc

###MAIN GUI###
class mainProgram(QtWidgets.QMainWindow, Ui_MainWindow):                   #main window 
    def __init__(self, parent=None):

        super(mainProgram, self).__init__(parent)
        self.setupUi(self)            
        self.dialog = Dialog1(self)
        self.dialog2 = Dialog2(self)
        self.dialog3 = Dialog3(self)
        self.dialog3.close()
        self.dialog4 = Dialog4(self)
        self.dialog5 = Dialog5(self)
        self.dialog6 = Dialog6(self)

if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    splash_pix = QPixmap('loading.jpg')
    splash_pix.scaled(200, 400, QtCore.Qt.KeepAspectRatio)
    splash = QSplashScreen(splash_pix,Qt.WindowStaysOnTopHint)
    splash.setMask(splash_pix.mask())
    splash.show()
    app.processEvents()
    nextGui = mainProgram()

    # nextGui.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    splash.finish(nextGui)
    nextGui.showMaximized()
    sys.exit(app.exec_()) 

假设唯一的问题是大量的对话,而不是每个对话本身都有一项耗时大量时间的任务,因此可能的选择是每个对话框加载每个对话框,因此在临时时间,Qsplashscreen正常工作。

# ...
###MAIN GUI###
class mainProgram(QtWidgets.QMainWindow, Ui_MainWindow):
    loadFinished = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(mainProgram, self).__init__(parent)
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self._T_dialogs = iter(
            enumerate((Dialog1, Dialog2, Dialog3, Dialog4, Dialog5, Dialog6))
        )
        self._timer = QtCore.QTimer(self, timeout=self.create_dialogs, interval=100)
        self._timer.start()
    @QtCore.pyqtSlot()
    def create_dialogs(self):
        try:
            i, T = next(self._T_dialogs)
            w = T(self)
            setattr(self, "dialog{}".format(i), w)
        except StopIteration:
            self._timer.stop()
            self.showMaximized()
            self.loadFinished.emit()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    splash_pix = QtGui.QPixmap("loading.jpg")
    splash_pix.scaled(200, 400, QtCore.Qt.KeepAspectRatio)
    splash = QtWidgets.QSplashScreen(splash_pix, QtCore.Qt.WindowStaysOnTopHint)
    splash.setMask(splash_pix.mask())
    splash.show()
    nextGui = mainProgram()
    nextGui.loadFinished.connect(splash.close)
    sys.exit(app.exec_())

最新更新