首页 > 解决方案 > 从 ui 对话框导入中阻止启动屏幕

问题描述

我已经制作了一个大型应用程序,在主应用程序(主循环)中导入了大量对话框。这些对话框导入时间很长,所以我做了一个启动画面,但主循环中的启动画面当然被长时间导入阻止了。认为我没有得到的是我不能在主循环中移动导入,因为我从创建 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_()) 

标签: pythonpyqtpyqt5

解决方案


假设唯一的问题是大量对话,而不是每个对话本身都有一个消耗大量时间的任务,因此可能的选择是每 T ms 加载每个对话,以便在过渡时间内 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_())

推荐阅读