在 PyQt 中添加启动画面

68 阅读2分钟

在 PyQt 中,通常使用登录对话框作为应用程序的入口。为了提高用户体验,可以在登录对话框出现之前显示一个启动画面,用于显示应用程序的徽标或其他信息。

解决方案

要添加启动画面,可以使用以下步骤:

  1. 导入必要的模块:
import sys
import time
from PyQt4 import QtGui, QtCore
from loginD import *
from mainwindow import Ui_MainWindow
  1. 定义一个启动画面类:
class SplashScreen(QtGui.QSplashScreen):

    def __init__(self, pixmap):
        super().__init__(pixmap, QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)  # 去掉边框
        self.show()

    def closeEvent(self, event):
        event.ignore()
        self.hide()

    def start(self):
        QtCore.QTimer.singleShot(2000, self.close)  # 2 秒后关闭启动画面
  1. 在应用程序的主函数中,创建启动画面并显示它:
if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    splash_pix = QtGui.QPixmap('logo.png')
    splash = SplashScreen(splash_pix)
    splash.start()

    app.processEvents()  # 使应用程序处理事件

    if Login().exec_() == QtGui.QDialog.Accepted:
        window = Main_Window()
        window.show()
        sys.exit(app.exec_())

代码例子

import sys
import time
from PyQt4 import QtGui, QtCore
from loginD import *
from mainwindow import Ui_MainWindow

class SplashScreen(QtGui.QSplashScreen):

    def __init__(self, pixmap):
        super().__init__(pixmap, QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)  # 去掉边框
        self.show()

    def closeEvent(self, event):
        event.ignore()
        self.hide()

    def start(self):
        QtCore.QTimer.singleShot(2000, self.close)  # 2 秒后关闭启动画面

class Login(QtGui.QDialog):
    # A dialog with username and password lineedit
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_LoginD()
        self.ui.setupUi(self)
        self.ui.PasswordLE.setEchoMode(QtGui.QLineEdit.Password)
        QtCore.QObject.connect(self.ui.LoginPB, QtCore.SIGNAL('clicked()'),
                               self.HandleLogin)

    def HandleLogin(self):
        if self.ui.PasswordLE.text() == "pass":
            self.accept()
        else:
            QtGui.QMessageBox.warning(
                self, 'Error;', 'bad')

class Main_Window(QtGui.QMainWindow):
    # main window ui
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    splash_pix = QtGui.QPixmap('logo.png')
    splash = SplashScreen(splash_pix)
    splash.start()

    app.processEvents()  # 使应用程序处理事件

    if Login().exec_() == QtGui.QDialog.Accepted:
        window = Main_Window()
        window.show()
        sys.exit(app.exec_())

在上面的代码中,SplashScreen 类是一个自定义的启动画面类,它继承自 QtGui.QSplashScreen 类。__init__ 方法接受一个 pixmap 参数,并将其设置为启动画面的背景图片。start 方法使用 QtCore.QTimer.singleShot 方法在 2 秒后关闭启动画面。Login 类是一个登录对话框类,它继承自 QtGui.QDialog 类。__init__ 方法设置登录对话框的界面。HandleLogin 方法处理登录逻辑。Main_Window 类是一个主窗口类,它继承自 QtGui.QMainWindow 类。__init__ 方法设置主窗口的界面。

在主函数中,首先创建了一个 SplashScreen 对象并显示它。然后,调用 app.processEvents() 方法使应用程序处理事件。接下来,调用 Login 对象的 exec_ 方法显示登录对话框。如果登录成功,则创建并显示 Main_Window 对象。