利用PySide6/PyQt6实现步调启动画面的处置惩罚

[复制链接]
发表于 2025-9-14 10:24:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 PySide6 / PyQt6 或其他 GUI 步调中,启动画面紧张有以下几个作用:提升用户体验,当主步调初始化须要几秒钟时,假如界面不绝空缺,用户大概以为步调没相应;品牌展示,常见做法是在启动画面上放置 公司 Logo、应用图标、版本号、版权信息;步调架构上的过渡,启动画面在主窗口创建前显示,等主步调预备停当后再关闭,起到 过渡和占位 的作用。
1、简朴例子代码先容

在 PySide6 / PyQt6 里要实现启动画面(Splash Screen),通常可以用 QSplashScreen 来完成,和 wx.adv.SplashScreen 类似。它的紧张作用是在主窗口加载前,先显示一个过渡画面(通常放 logo、版本号、加载提示)。
简朴的案例代码如下所示。
  1. def main():
  2.     app = QApplication(sys.argv)
  3.     # 创建启动画面
  4.     pixmap = QPixmap(400, 300)  # 可以替换为 QPixmap("logo.png")
  5.     pixmap.fill(Qt.white)  # 这里用纯白背景
  6.     splash = QSplashScreen(pixmap)
  7.     splash.showMessage("正在加载,请稍候...", Qt.AlignBottom | Qt.AlignCenter, Qt.black)
  8.     splash.show()
  9.     # 模拟加载过程(比如初始化数据库、加载配置等)
  10.     for i in range(1, 6):
  11.         splash.showMessage(f"正在加载资源 {i}/5 ...", Qt.AlignBottom | Qt.AlignCenter, Qt.black)
  12.         app.processEvents()  # 让界面刷新
  13.         time.sleep(0.5)
  14.     # 加载完成后进入主窗口
  15.     window = MainWindow()
  16.     # 延迟关闭启动画面并显示主窗口
  17.     QTimer.singleShot(500, lambda: (
  18.         splash.finish(window),
  19.         window.show()
  20.     ))
  21.     sys.exit(app.exec())
  22. if __name__ == "__main__":
  23.     main()
复制代码
关键点:

  • QSplashScreen

    • 通过 QSplashScreen(QPixmap) 创建。
    • showMessage(text, alignment, color) 用来显示提示信息。
    • finish(widget) 在主窗口预备好后关闭 Splash,并显示目标窗口。

  • app.processEvents()

    • 在耗时操纵中调用,确保 Splash 画面能革新,不会卡死。

  • QTimer.singleShot()

    • 可以制止界面卡顿,等初始化完成后关闭启动画面。

2、我利用PySide6/PyQt6实现步调启动画面

参照上面的过程,我们可以改进下步调启动画面,并团结步调初始化等过程举行展示。
我们在步调登录界面展示,用户确认登录乐成后,提示启动画面的。

 用户登录乐成后,闪屏启动页面举行展示

 实现过程也是和上面的例子类似,不外增加了一些特殊的处置惩罚。
起首封装好显示闪屏界面的函数,如下所示。
  1. def<strong> show_splash_screen</strong>():
  2.     """显示启动闪屏"""
  3.     splash_pix = QPixmap("app/images/splash.png")
  4.     splash = QSplashScreen(splash_pix, Qt.WindowType.WindowStaysOnTopHint)
  5.     # 设置字体
  6.     font = QFont("Arial", 20, QFont.Weight.Bold)
  7.     splash.setFont(font)
  8.     splash.showMessage(
  9.         "正在加载,请稍候...",
  10.         Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignCenter,
  11.         Qt.GlobalColor.yellow,
  12.     )
  13.     <strong>splash.show()
  14.     </strong>return splash
复制代码
然后再启动的main.py的main函数中处置惩罚各个操纵过程即可。
  1. async def<strong> init_app</strong>():
  2.     app = SystemApp()
  3.     await app.<strong>SetLoginInfo</strong>()
  4. def main():
  5.     app = QApplication(sys.argv)
  6.     event_loop = QEventLoop(app)
  7.     asyncio.set_event_loop(event_loop)
  8.     app_close_event = asyncio.Event()
  9.     app.aboutToQuit.connect(app_close_event.set)
  10.     app.setStyle("Fusion")  # 设置样式# 显示登录窗口
  11.     loginDialog = FrmLogin()
  12.     if loginDialog.exec() != QDialog.DialogCode.Accepted:
  13.         # 如果登录失败或取消,程序退出
  14.         sys.exit(0)
  15.     # 显示闪屏
  16.     <strong>splash = show_splash_screen()
  17.     </strong># 主窗口
  18.     main_window = MainWindow()
  19.     # 设置托盘图标
  20.     setup_tray_icon(app, main_window)
  21.     # 闪屏后显示主界面, 1秒后窗口最大化显示
  22.    <strong> QTimer.singleShot(1000, lambda: (splash.close(), main_window.showMaximized()))
  23.     </strong># sys.exit(app.exec())
  24.     with event_loop:
  25.         event_loop.create_task(<strong>init_app()</strong>)
  26.         event_loop.run_until_complete(app_close_event.wait())
  27. if __name__ == "__main__":
  28.     main()
复制代码
我们的主步调利用了异步的操纵,因此和上面的例子有所差别,在用户登录乐成后,前端会得到相干的用户身份信息,并在 init_app() 函数中举行用户身份信息的获取和设置。
我们把用户身份信息的处置惩罚,单独抽取出来,放在system_app类内里举行处置惩罚,如下所示,可以根据登任命户的信息,获取用户的当前拥有的功能权限,角色聚集等等。

前面随笔我先容过, 对于列表和对话框界面的封装,能够简化对泛型模型数据的同一处置惩罚,通用对于前端用户身份信息,我们也可以会合在基类中获取。


 编辑对话框的基类同样的处置惩罚。

 如许我们在用户前端界面中,须要设置用户当前信息的时间,就可以随时通过基类函数举行获取了。
上面代码,团结闪屏启动界面的处置惩罚过程,先容了在用户登录乐成后,对用户相干信息的处置惩罚过程。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表