PySide6 / PyQt6 或其他 GUI 程序中,启动画面主要有以下几个作用:提升用户体验,当主程序初始化需要几秒钟时,如果界面一直空白,用户可能以为程序没响应;品牌展示,常见做法是在启动画面上放置 公司 Logo、应用图标、版本号、版权信息;程序架构上的过渡,启动画面在主窗口创建前显示,等主程序准备就绪后再关闭,起到 过渡和占位 的作用。

1、简单例子代码介绍

PySide6 / PyQt6 里要实现启动画面(Splash Screen),通常可以用 QSplashScreen 来完成,和 wx.adv.SplashScreen 类似。它的主要作用是在主窗口加载前,先显示一个过渡画面(通常放 logo、版本号、加载提示)。

简单的案例代码如下所示。

def main():
app = QApplication(sys.argv) # 创建启动画面
pixmap = QPixmap(400, 300) # 可以替换为 QPixmap("logo.png")
pixmap.fill(Qt.white) # 这里用纯白背景
splash = QSplashScreen(pixmap)
splash.showMessage("正在加载,请稍候...", Qt.AlignBottom | Qt.AlignCenter, Qt.black)
splash.show() # 模拟加载过程(比如初始化数据库、加载配置等)
for i in range(1, 6):
splash.showMessage(f"正在加载资源 {i}/5 ...", Qt.AlignBottom | Qt.AlignCenter, Qt.black)
app.processEvents() # 让界面刷新
time.sleep(0.5) # 加载完成后进入主窗口
window = MainWindow() # 延迟关闭启动画面并显示主窗口
QTimer.singleShot(500, lambda: (
splash.finish(window),
window.show()
)) sys.exit(app.exec()) if __name__ == "__main__":
main()

关键点:

  1. QSplashScreen

    • 通过 QSplashScreen(QPixmap) 创建。

    • showMessage(text, alignment, color) 用来显示提示信息。

    • finish(widget) 在主窗口准备好后关闭 Splash,并显示目标窗口。

  2. app.processEvents()

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

  3. QTimer.singleShot()

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

2、我使用PySide6/PyQt6实现程序启动画面

参照上面的过程,我们可以改进下程序启动画面,并结合程序初始化等过程进行展示。

我们在程序登录界面展示,用户确认登录成功后,提示启动画面的。

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

实现过程也是和上面的例子类似,不过增加了一些特殊的处理。

首先分钟好显示闪屏界面的函数,如下所示。

def show_splash_screen():
"""显示启动闪屏"""
splash_pix = QPixmap("app/images/splash.png")
splash = QSplashScreen(splash_pix, Qt.WindowType.WindowStaysOnTopHint) # 设置字体
font = QFont("Arial", 20, QFont.Weight.Bold)
splash.setFont(font)
splash.showMessage(
"正在加载,请稍候...",
Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignCenter,
Qt.GlobalColor.yellow,
)
splash.show()
return splash

然后再启动的main.py的main函数中处理各个操作过程即可。

async def init_app():
app = SystemApp()
await app.SetLoginInfo() def main():
app = QApplication(sys.argv) event_loop = QEventLoop(app)
asyncio.set_event_loop(event_loop) app_close_event = asyncio.Event()
app.aboutToQuit.connect(app_close_event.set) app.setStyle("Fusion") # 设置样式# 显示登录窗口
loginDialog = FrmLogin()
if loginDialog.exec() != QDialog.DialogCode.Accepted:
# 如果登录失败或取消,程序退出
sys.exit(0) # 显示闪屏
splash = show_splash_screen()
# 主窗口
main_window = MainWindow()
# 设置托盘图标
setup_tray_icon(app, main_window)
# 闪屏后显示主界面, 1秒后窗口最大化显示
QTimer.singleShot(1000, lambda: (splash.close(), main_window.showMaximized())) # sys.exit(app.exec()) with event_loop:
event_loop.create_task(init_app())
event_loop.run_until_complete(app_close_event.wait()) if __name__ == "__main__":
main()

我们的主程序使用了异步的操作,因此和上面的例子有所差异,在用户登录成功后,前端会获得相关的用户身份信息,并在 init_app() 函数中进行用户身份信息的获取和设置。

我们把用户身份信息的处理,单独抽取出来,放在system_app类里面进行处理,如下所示,可以根据登录用户的信息,获取用户的当前拥有的功能权限,角色集合等等。

前面随笔我介绍过, 对于列表和对话框界面的封装,能够简化对泛型模型数据的统一处理,通用对于前端用户身份信息,我们也可以集中在基类中获取。

编辑对话框的基类同样的处理。

这样我们在用户前端界面中,需要设置用户当前信息的时候,就可以随时通过基类函数进行获取了。

上面代码,结合闪屏启动界面的处理过程,介绍了在用户登录成功后,对用户相关信息的处理过程。

使用PySide6/PyQt6实现程序启动画面的处理的更多相关文章

  1. Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少. 比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找 ...

  2. QT之实现程序启动画面

    现在好多软件都有,尤其是大型软件,他们要加载的东西太多,因此需要的事件较长,而又不希望给用户产生成为好像没有响应的情况,因此也就需要程序启动画面来实现. 当然了,用widget要比这个丰富很多,不过代 ...

  3. QSplashScreen类实现Qt程序启动画面

      QSplashScreen类实现Qt程序启动画面 收藏人:zwsj     2013-09-13 | 阅:569  转:6    |   来源   |  分享               程序启动 ...

  4. 用VC制作应用程序启动画面

    摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢 ...

  5. MFC之窗体改动工具栏编程状态栏编程程序启动画面

    1窗体外观的改动 (1)改动在CMainFrame::preCreateWindow(CREATESTRUCT& cs) 改动标题:cs.style&=FWS_ADDTOTITLE; ...

  6. Android -- 程序启动画面 Splash

    很多应用都会有一个启动界面.欢迎画面慢慢隐现,然后慢慢消隐. 我的方式是使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一 ...

  7. Delphi开发 Android 程序启动画面简单完美解决方案

    原文在这里 还是这个方法好用,简单!加上牧马人做的自动生成工具,更是简单. 以下为原文,向波哥敬礼! 前面和音儿一起研究 Android 下启动画面的问题,虽然问题得到了解决,但是,总是感觉太麻烦,主 ...

  8. Qt5 程序启动画面动图效果

    2333终于实现动图,先弄了一个窗口去掉标题栏假装就是启动画面了,还是那只萌萌的猫这次会动了! 基类用的是QWidget  类名称MainView #ifndef MAINVIEW_H #define ...

  9. Qt5 程序启动画面图片效果

    2333每次打开photoshop开启画面是在酷炫,其实也不难啦. 新建项目名称SplashScreen,基类默认,取消创建界面复选框,完成. 代码如下,图片资源文件自己添加(已上传还未实现动态效果学 ...

  10. qt程序启动画面

随机推荐

  1. java基础之运算符的优先级

    运算符的优先级(从高到低) 优先 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 << ...

  2. C/C++实现Perigram属性

    C/C++实现Perigram属性 通常描述信号瞬时特征的物理量有:瞬时振幅.瞬时相位.及瞬时频率("三瞬参数"),地震波的瞬时参数不仅可以直接用来研究岩性.构造等,而且也能够反演 ...

  3. Oracle并发控制

    并发与锁定 当多用户同一时刻访问相同的数据库资源时,将产生并发.并发极易破坏数据的一致性.锁定是处理并发的重要手段,用户在修改某一资源前,必须首先获得资源的修改权.而这种修改权具有排他性. 并发与锁定 ...

  4. 想让自己的Ubuntu更漂亮嘛?

    近期没啥大项目在进行,今天闲来无事,值班空闲时间,忽然发现自己的Ubuntu竟是如此的"丑"(虽然用过这么多Linux发行版,但不得不承认Ubuntu唯一的优点就是好看!),于是准 ...

  5. MP3 进行时

    MP3 项目立项 责任人:李少帅 开始时间:2016: 10,07 首先观看  MP3视频 理解 MP3  代码 重新 全面看 ucos2  或者是三的 视频代码

  6. shell 一下子创建多个 led文件

    #!bin/bash seq -f "led%0g" 0 110| xargs mkdir for((i = 0;i<36;i++)) do led="led&qu ...

  7. java 核心编程 toolbar

    简介 toolbar code /* * @Author: your name * @Date: 2020-11-08 09:38:15 * @LastEditTime: 2020-11-08 10: ...

  8. spring-ai 学习系列(4)-MCP 处理过程分析

    上一节,通过1个最基本的MCP Server/Client示例,初步了解了MCP的用法.STDIO模式下,client与server同在1台机器上,client会创建1个子进程来启动server,然后 ...

  9. Unity Shader 像素图描边

    思路:在片元着色器中,处理像素p,针对p的上下左右四个像素采样(使用一个变量width来控制描边宽度,也就是处理上下左右多远的像素),若p本身是透明像素,则 若上下左右存在非透明像素,则当前像素p返回 ...

  10. Leetcode1681-模拟,位运算

    题目链接:https://leetcode.cn/problems/count-the-number-of-consistent-strings/description/ 32位int构造出现过的字符 ...