PyQt5实现多界面自由切换的完整项目实践指南

作者:

文章目录
  • 在Python GUI开发中,PyQt5提供了强大的界面构建能力,支持通过QMainWindow、QStackedWidget和QWizard等组件实现多界面来回切换。本项目围绕“多界面切换”这一核心需求,结合实际应用场景,详细演示如何在登录页、主窗口与向导式流程之间进行灵活跳转。通过main.py作为程序入口,集成由Qt Designer生成的UI布局文件,并利用事件驱动机制(如按钮点击)触发界面切换逻辑,帮助开发者掌握PyQt5中多窗口管理的核心技术,提升桌面应用的交互性与可维护性。 你有没有遇到过这样的情况:项目初期,UI只是简单的几个按钮和输入框,代码写得飞快;可几个月后,界面越堆越多,跳转逻辑错综复杂,每次改一个小功能都像在拆炸弹?我见过太多团队被“界面耦合”拖垮——一个页面改了ID,三个地方报错;切换页面卡顿、内存蹭蹭上涨……这背后,往往不是技术不行,而是 架构选择出了问题 。 今天咱们就来聊聊,如何用 PyQt5 构建一个既灵活又稳定、能从小工具一路撑到企业级应用的多界面系统。我们不光讲“怎么写”,更要说清楚“为什么这么写”。毕竟,真正的高手,拼的是架构思维 
  • 先问一个问题:你在写 PyQt 应用时,是直接继承 QWidget 还是 QMainWindow ?别小看这个选择,它决定了你的应用是“玩具”还是“专业工具”。 很多初学者图省事,上来就 class MyWindow(QWidget) ,结果做到后面发现:菜单加不上、状态栏不会弄、工具栏位置乱飘……最后只能推倒重来。而 QMainWindow 从出生那天起,就是为“完整桌面应用”准备的。
  • 说到 QStackedWidget ,很多人以为它就是个“翻牌器”——点一下,换一页。但如果你只把它当这么用,那就太浪费了。 它的真正价值在于: 以最小代价实现多界面共存与动态调度 。
  • 现在我们解决了“页面怎么放”的问题,接下来是“怎么切”。 你可能见过这种写法: btn.clicked.connect(lambda: stack.setCurrentIndex(1)) # ❌ 硬编码! 看着没问题,但如果哪天你把“设置页”挪到了第3个位置呢?所有 setCurrentIndex(1) 都得改,简直是维护噩梦。
  • 另一个高频问题是:页面之间怎么传数据? 比如登录成功后,怎么把用户名传给主页面? 新手常犯的错误是搞个 global current_user ,然后到处引用。短期看挺好使,长期看埋雷。
  • 说了这么多代码,是不是觉得 UI 布局太麻烦?别忘了,PyQt5 配套的 Qt Designer 才是生产力神器! 为什么一定要用 .ui 文件 因为: 拖拖拽拽就能画界面,效率提升80% 界面和逻辑分离,美工改 UI 不影响代码 支持预览不同分辨率下的效果 可版本控制 .ui 文件(XML格式) 操作步骤很简单: 打开 designer (命令行输入即可) 新建一个 Widget 或 Main Window 拖控件、设属性、调布局 保存为 login.ui 然后用 pyuic5 转成 Python 文件: pyuic5 -x ui/login.ui -o views/ui_login.py 生成的代码长这样: class Ui_LoginForm(object): def setupUi(self, LoginForm): LoginForm.setObjectName(“LoginForm”) LoginForm.resize(400, 300) self.lineEdit_username = QLineEdit(LoginForm) self.lineEdit_username.setGeometry(…) self.lineEdit_password = QLineEdit(LoginForm) self.lineEdit_password.setEchoMode(QLineEdit.Password) self.btn_login = QPushButton(“登录”, LoginForm) def retranslateUi(self, LoginForm): _translate = QCoreApplication.translate LoginForm.setWindowTitle(_translate(“LoginForm”, “登录”)) 接着你在自己的类里组合它: from views.ui_login import Ui_LoginForm class LoginWindow(QWidget, Ui_LoginForm): def __init__(self): super().__init__() self.setupUi(self) # 自动生成界面 self.btn_login.clicked.connect(self.handle_login) def handle_login(self): username = self.lineEdit_username.text() password = self.lineEdit_password.text() if authenticate(username, password): app_state.current_user = User(username, “user”) nav.goto_main.emit() else: QMessageBox.warning(self, “错误”, “用户名或密码错误”) 看到没?UI 自动搭建,你只管写逻辑。这才是现代化开发的样子!
  • 最后一步:打包发布。 没人愿意让用户装 Python 才能运行你的程序,对吧?所以我们用 PyInstaller 把整个项目打成一个 .exe (Windows)或 .app (macOS)。
  • 回顾一下,我们今天聊的不是一个简单的“多页面切换”技巧,而是一整套 现代 PyQt 桌面应用的架构范式 : 用 QMainWindow + QStackedWidget 搭建主框架 :稳定、专业、易于扩展; 页面懒加载 :避免启动卡顿,提升用户体验; 信号驱动导航 :解耦页面与控制器,提高可维护性; Qt Designer + PyUIC :实现 UI 与逻辑分离,提升开发效率; 状态管理替代全局变量 :让数据流动更清晰、更安全; PyInstaller 打包发布 :交付即用型产品,无需依赖环境。 这套组合拳下来,哪怕你的项目从一个小工具慢慢长成一个复杂系统,也能稳如老狗。 记住一句话: 好的架构不是一开始设计出来的,而是在一次次迭代中坚持原则演化出来的 。别怕麻烦,先把架子搭正,后面的路才会越走越宽。 以上就是PyQt5实现多界面自由切换的完整项目实践指南的详细内容,更多关于PyQt5界面切换的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: PyQt5使用QtDesigner实现多界面切换程序的全过程 python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例 PyQt实现界面翻转切换效果 PyQt5利用Qt Designer实现简单界面交互 PyQt5界面无响应的解决方案 PyQt界面阻塞卡死问题的解决
  • 目录
    • 简介
    • 主窗口不只是个容器:QMainWindow 的设计哲学
      • 它到底强在哪
      • 举个真实场景:智能音箱配置工具
    • QStackedWidget:不只是“翻页”,它是界面调度中枢
      • 它是怎么工作的
      • 懒加载:大项目必学的性能优化技巧
    • 别再硬编码索引了!解耦才是高级玩法
      • 更好的方式:按对象切换
      • 最优雅的方式:信号驱动 + 导航混入
    • 数据怎么传?别用全局变量!
      • 正确姿势:构造函数传参 or 属性注入
      • 复杂场景:用事件总线或状态管理
    • Qt Designer + PyUIC:可视化开发的正确打开方式
      • 工程化部署:从脚本到独立程序
        • 自动化编译 UI 文件
        • 打包成独立可执行文件
      • 总结:构建可持续演进的 PyQt 应用

        在Python GUI开发中,PyQt5提供了强大的界面构建能力,支持通过QMainWindow、QStackedWidget和QWizard等组件实现多界面来回切换。本项目围绕“多界面切换”这一核心需求,结合实际应用场景,详细演示如何在登录页、主窗口与向导式流程之间进行灵活跳转。通过main.py作为程序入口,集成由Qt Designer生成的UI布局文件,并利用事件驱动机制(如按钮点击)触发界面切换逻辑,帮助开发者掌握PyQt5中多窗口管理的核心技术,提升桌面应用的交互性与可维护性。

        你有没有遇到过这样的情况:项目初期,UI只是简单的几个按钮和输入框,代码写得飞快;可几个月后,界面越堆越多,跳转逻辑错综复杂,每次改一个小功能都像在拆炸弹?我见过太多团队被“界面耦合”拖垮——一个页面改了ID,三个地方报错;切换页面卡顿、内存蹭蹭上涨……这背后,往往不是技术不行,而是 架构选择出了问题

        今天咱们就来聊聊,如何用 PyQt5 构建一个既灵活又稳定、能从小工具一路撑到企业级应用的多界面系统。我们不光讲“怎么写”,更要说清楚“为什么这么写”。毕竟,真正的高手,拼的是架构思维 

        先问一个问题:你在写 PyQt 应用时,是直接继承 QWidget 还是 QMainWindow ?别小看这个选择,它决定了你的应用是“玩具”还是“专业工具”。

        很多初学者图省事,上来就 class MyWindow(QWidget) ,结果做到后面发现:菜单加不上、状态栏不会弄、工具栏位置乱飘……最后只能推倒重来。而 QMainWindow 从出生那天起,就是为“完整桌面应用”准备的。

        想象一下 Photoshop 或者 VS Code 这类软件,是不是都有这么一套布局:

        • 顶部一排菜单(文件、编辑、视图…)
        • 上面或侧面一堆快捷按钮(保存、撤销、运行…)
        • 底部显示状态信息(缩放比例、光标位置…)
        • 中间一大块区域放核心内容
        • 左右还能停靠面板(图层、资源管理器…)

        这个结构,Qt 叫它 “主窗口模式”(Main Window Pattern) ,而 QMainWindow 就是它的标准实现。

        from PyQt5.QtWidgets import QMainWindow, QLabel
        from PyQt5.QtCore import Qt
        
        class ProfessionalApp(QMainWindow):
            def __init__(self):
                super().__init__()
                self.setWindowTitle("专业级应用示例")
                self.resize(1000, 700)
        
                # ✅ 唯一必须设置的部分:中央部件
                central = QLabel("这里是你的主界面", alignment=Qt.AlignCenter)
                self.setCentralWidget(central)
        
                # 🔽 下面这些,随你开不开,全由你控制
                self._setup_menu_bar()
                self._setup_tool_bars()
                self._setup_status_bar()
                self._setup_dock_widgets()
        

        看到没?中央部件是唯一强制项,其他全是可选模块。这种“中心+边缘”的设计,不只是为了好看,更是为了 职责分离

        区域 职责 开发建议
        中央部件 承载主业务逻辑,用户注意力焦点 QStackedWidget ,管理多个页面
        菜单栏 系统化功能入口,适合层级命令 如“文件 → 导出 → PDF”
        工具栏 高频操作快捷通道 图标+文字,支持拖动停靠
        状态栏 实时反馈与上下文提示 显示进度、鼠标悬停说明等
        停靠窗口 辅助性浮动面板 如调试日志、属性编辑

        小知识: QMainWindow 内部其实是个 QMenuBar + QToolBar + QStatusBar + CentralWidget + DockWidgetArea 的组合体,但它把这些细节封装好了,让你不用手动算坐标、调尺寸。

        假设你在做一个蓝牙音箱的 PC 配置工具,用户需要完成以下流程:

        • 登录账号
        • 扫描并连接设备
        • 调整音效参数
        • 固件升级
        • 查看帮助文档

        这时候你会怎么做?一个个弹窗跳?那体验肯定糟透了。更好的方式是: 主窗口不动,只换中间的内容区

        这就引出了我们今天的主角—— QStackedWidget

        graph TD
            A[QMainWindow] –> B[顶部: 菜单栏]
            A –> C[左侧/右侧: 停靠面板(可选)]
            A –> D[底部: 状态栏]
            A –> E[四周: 工具栏(可浮动)]
            A –> F[中心: QStackedWidget ← 关键!]
            F –> G[页面0: 登录页]
            F –> H[页面1: 设备列表]
            F –> I[页面2: 音效设置]
            F –> J[页面3: 固件更新]
            F –> K[页面4: 帮助中心]

        看到了吗?所有页面都在同一个主框架下切换,菜单、工具栏保持一致,用户始终知道自己“在哪”,这就是专业感的来源 。

        说到 QStackedWidget ,很多人以为它就是个“翻牌器”——点一下,换一页。但如果你只把它当这么用,那就太浪费了。

        它的真正价值在于: 以最小代价实现多界面共存与动态调度

        简单说, QStackedWidget 是一个“只有一个孩子”的父亲。虽然它肚子里藏了一堆 QWidget ,但每次只让一个出来见人,其他的都藏起来( hide() ),但不杀掉( delete )。

        from PyQt5.QtWidgets import QStackedWidget, QWidget, QVBoxLayout, QPushButton
        
        class PageController(QStackedWidget):
            def __init__(self):
                super().__init__()
                self._pages = {}  # 缓存页面实例
                self.init_pages()
        
            def init_pages(self):
                # 页面0 - 主页
                home = QWidget()
                layout = QVBoxLayout()
                layout.addWidget(QPushButton("去设置"))
                home.setLayout(layout)
                self.addWidget(home)
                self._pages['home'] = home
        
                # 页面1 - 设置页
                settings = QWidget()
                layout = QVBoxLayout()
                layout.addWidget(QPushButton("回主页"))
                settings.setLayout(layout)
                self.addWidget(settings)
                self._pages['settings'] = settings
        
                # 默认显示首页
                self.setCurrentIndex(0)
        

        这里有几个关键点你必须知道:

        • 页面不会被销毁 :除非你手动 removeWidget() + deleteLater() ,否则它们一直活在内存里。
        • 索引决定显示谁 :当前显示的是哪个页面,完全由 currentIndex 控制。
        • 可以监听切换事件 currentChanged(int) 信号告诉你“用户刚去了哪”。
        # 监听页面切换
        self.currentChanged.connect(self.on_page_changed)
        
        def on_page_changed(self, index):
            print(f"🎯 用户进入了第 {index} 个页面")
            page_map = {0: "主页", 1: "设置页"}
            self.parent().statusBar().showMessage(f"进入: {page_map.get(index, '未知')}")
        
            # 更进一步:根据页面类型执行不同逻辑
            current_widget = self.widget(index)
            if hasattr(current_widget, 'on_enter'):
                current_widget.on_enter()  # 触发页面专属的“进入”行为
        

        注意: widget(index) 返回的是原始指针,如果该索引无效会返回 None ,记得判空!

        但问题来了:如果我有10个页面,全都一次性创建,启动时会不会很慢?内存会不会爆?

        当然会!尤其是那些包含图表、视频播放器、大量数据加载的页面。这时候就得上 懒加载(Lazy Loading)

        核心思想: 只有当用户第一次访问某个页面时,才真正创建它

        class LazyStackedWidget(QStackedWidget):
            def __init__(self):
                super().__init__()
                self._factories = {}  # 存储“造页面”的函数
                self._loaded = set()  # 记录已加载的页面索引
        
            def add_lazy_page(self, index: int, create_func, placeholder_text="加载中..."):
                """注册一个延迟加载的页面"""
                placeholder = QLabel(placeholder_text, alignment=Qt.AlignCenter)
                self.insertWidget(index, placeholder)
                self._factories[index] = create_func
        
                # 当该页面首次被激活时,才真正创建
                def load_once():
                    if index not in self._loaded:
                        real_page = create_func()
                        self.removeWidget(placeholder)
                        self.insertWidget(index, real_page)
                        self._loaded.add(index)
                        placeholder.deleteLater()
        
                # 使用一次性的连接,避免重复触发
                from functools import partial
                self.widgetRemoved.connect(partial(lambda i, f=load_once: f() if i == index else None))
        
            def setCurrentIndex(self, index):
                # 强制刷新:先移除再设回,触发 widgetRemoved 信号
                if index in self._factories and index not in self._loaded:
                    old_idx = self.currentIndex()
                    self.parent().setCentralWidget(QWidget())  # 临时替换
                    self.parent().setCentralWidget(self)       # 再换回来
                    super().setCurrentIndex(old_idx)
                    super().setCurrentIndex(index)
                else:
                    super().setCurrentIndex(index)
        

        用法也很简单:

        def create_heavy_page():
            # 模拟耗时操作
            import time; time.sleep(1)
            page = QWidget()
            page.setLayout(QVBoxLayout())
            page.layout().addWidget(QLabel("这是个重型页面,加载花了1秒"))
            return page
        
        stack = LazyStackedWidget()
        stack.add_lazy_page(0, lambda: QLabel("轻量首页"), "首页")
        stack.add_lazy_page(1, create_heavy_page, "重型页面...")
        

        这样,启动瞬间就能看到首页,点击“去重型页面”时才会卡一下——用户体验好太多了 。

        现在我们解决了“页面怎么放”的问题,接下来是“怎么切”。

        你可能见过这种写法:

        btn.clicked.connect(lambda: stack.setCurrentIndex(1))  # ❌ 硬编码!
        

        看着没问题,但如果哪天你把“设置页”挪到了第3个位置呢?所有 setCurrentIndex(1) 都得改,简直是维护噩梦。

        PyQt 早就想到了这一点,提供了 setCurrentWidget(QWidget*) 方法:

        settings_page = SettingsWidget()
        stack.addWidget(settings_page)
        
        btn.clicked.connect(lambda: stack.setCurrentWidget(settings_page))  # ✅ 推荐!
        

        现在不管它在第几个位置,都能准确跳转。而且代码自解释性强多了:“我要去设置页”,而不是“我要去第1页”。

        真正的大项目,应该做到 页面自己不知道外面有个堆栈 。也就是说,登录页不应该直接调用 stack.setCurrentIndex(1) ,因为它根本不该知道“主页面是第1页”。

        解决方案: 自定义信号 + 导航控制器

        from PyQt5.QtCore import pyqtSignal
        
        class NavigationRequest(QObject):
            goto_login = pyqtSignal()
            goto_main = pyqtSignal()
            goto_settings = pyqtSignal()
            goto_help = pyqtSignal()
        
        # 全局信号总线(或作为主窗口成员)
        nav = NavigationRequest()
        
        class LoginPage(QWidget):
            def __init__(self):
                super().__init__()
                btn = QPushButton("登录")
                btn.clicked.connect(self.try_login)
        
            def try_login(self):
                # 模拟验证
                if self.validate():
                    nav.goto_main.emit()  # 发信号:我要去主页面!
        
        class MainWindow(QMainWindow):
            def __init__(self):
                super().__init__()
                self.stack = QStackedWidget()
                self.setCentralWidget(self.stack)
        
                # 创建页面
                self.login_page = LoginPage()
                self.main_page = MainPage()
                self.settings_page = SettingsPage()
        
                self.stack.addWidget(self.login_page)
                self.stack.addWidget(self.main_page)
                self.stack.addWidget(self.settings_page)
        
                # 统一处理导航信号
                nav.goto_main.connect(lambda: self.stack.setCurrentWidget(self.main_page))
                nav.goto_settings.connect(lambda: self.stack.setCurrentWidget(self.settings_page))
                nav.goto_help.connect(lambda: self.stack.setCurrentWidget(self.help_page))
        

        你看,登录页只负责“发出请求”,主窗口负责“响应请求”。两者完全解耦,随便你怎么改页面顺序、增减页面,都不影响原有逻辑。

        提示:你可以把这个模式封装成一个 NavigationMixin ,让所有页面都能轻松调用 self.goto_main()

        另一个高频问题是:页面之间怎么传数据?

        比如登录成功后,怎么把用户名传给主页面?

        新手常犯的错误是搞个 global current_user ,然后到处引用。短期看挺好使,长期看埋雷。

        最干净的方式是在创建页面时就把数据塞进去:

        class MainPage(QWidget):
            def __init__(self, user: User):
                super().__init__()
                self.user = user
                layout = QVBoxLayout()
                layout.addWidget(QLabel(f"欢迎回来,{user.username}!"))
                self.setLayout(layout)
        
        # 登录成功后
        user = User(username="alice", role="admin")
        main_page = MainPage(user)
        stack.addWidget(main_page)
        nav.goto_main.emit()
        

        或者通过属性设置:

        main_page.user = user  # 在 emit 前设置
        nav.goto_main.emit()
        

        如果你的应用足够复杂(比如十几页、多人协作),建议引入 事件总线(Event Bus) 或轻量级状态管理。

        class AppState(QObject):
            user_changed = pyqtSignal(User)
        
            def __init__(self):
                super().__init__()
                self._current_user = None
        
            @property
            def current_user(self):
                return self._current_user
        
            @current_user.setter
            def current_user(self, value):
                self._current_user = value
                self.user_changed.emit(value)
        
        # 全局状态
        app_state = AppState()
        
        # 任何页面监听用户变化
        app_state.user_changed.connect(lambda u: print(f"用户变更为: {u.username}"))
        

        这样,无论哪个页面修改了用户状态,其他页面都能自动收到通知,彻底告别“手动同步”。

        说了这么多代码,是不是觉得 UI 布局太麻烦?别忘了,PyQt5 配套的 Qt Designer 才是生产力神器!

        为什么一定要用 .ui 文件

        因为:

        • 拖拖拽拽就能画界面,效率提升80%
        • 界面和逻辑分离,美工改 UI 不影响代码
        • 支持预览不同分辨率下的效果
        • 可版本控制 .ui 文件(XML格式)

        操作步骤很简单:

        • 打开 designer (命令行输入即可)
        • 新建一个 Widget Main Window
        • 拖控件、设属性、调布局
        • 保存为 login.ui

        然后用 pyuic5 转成 Python 文件:

        pyuic5 -x ui/login.ui -o views/ui_login.py
        

        生成的代码长这样:

        class Ui_LoginForm(object):
            def setupUi(self, LoginForm):
                LoginForm.setObjectName("LoginForm")
                LoginForm.resize(400, 300)
                self.lineEdit_username = QLineEdit(LoginForm)
                self.lineEdit_username.setGeometry(...)
                self.lineEdit_password = QLineEdit(LoginForm)
                self.lineEdit_password.setEchoMode(QLineEdit.Password)
                self.btn_login = QPushButton("登录", LoginForm)
        
            def retranslateUi(self, LoginForm):
                _translate = QCoreApplication.translate
                LoginForm.setWindowTitle(_translate("LoginForm", "登录"))
        

        接着你在自己的类里组合它:

        from views.ui_login import Ui_LoginForm
        
        class LoginWindow(QWidget, Ui_LoginForm):
            def __init__(self):
                super().__init__()
                self.setupUi(self)  # 自动生成界面
                self.btn_login.clicked.connect(self.handle_login)
        
            def handle_login(self):
                username = self.lineEdit_username.text()
                password = self.lineEdit_password.text()
                if authenticate(username, password):
                    app_state.current_user = User(username, "user")
                    nav.goto_main.emit()
                else:
                    QMessageBox.warning(self, "错误", "用户名或密码错误")
        

        看到没?UI 自动搭建,你只管写逻辑。这才是现代化开发的样子!

        最后一步:打包发布。

        没人愿意让用户装 Python 才能运行你的程序,对吧?所以我们用 PyInstaller 把整个项目打成一个 .exe (Windows)或 .app (macOS)。

        先写个脚本,一键把所有 .ui 转成 .py

        # tools/compile_ui.py
        import os
        import subprocess
        
        UI_DIR = "ui"
        VIEWS_DIR = "views"
        
        def compile_all():
            for file in os.listdir(UI_DIR):
                if file.endswith(".ui"):
                    input_path = os.path.join(UI_DIR, file)
                    output_name = f"ui_{file[:-3]}.py"
                    output_path = os.path.join(VIEWS_DIR, output_name)
                    cmd = ["pyuic5", "-o", output_path, input_path]
                    subprocess.run(cmd, check=True)
                    print(f"✅ 生成: {output_path}")
        
        if __name__ == "__main__":
            compile_all()
        

        以后每次改完 UI,运行 python tools/compile_ui.py 就行。

        安装 PyInstaller:

        pip install pyinstaller
        

        然后打包:

        pyinstaller
          –onefile
          –windowed
          –name "智能音箱配置工具"
          –icon assets/app.ico
          –add-data "ui;ui"
          main.py

        参数说明:

        参数 作用
        –onefile 所有文件打成一个 exe
        –windowed 不弹黑框(适合 GUI 应用)
        –icon 设置程序图标
        –add-data 添加额外资源(如 .ui 文件)

        最终生成 dist/智能音箱配置工具.exe ,双击就能运行,完全不需要 Python 环境 。

        回顾一下,我们今天聊的不是一个简单的“多页面切换”技巧,而是一整套 现代 PyQt 桌面应用的架构范式

        1. QMainWindow + QStackedWidget 搭建主框架 :稳定、专业、易于扩展;
        2. 页面懒加载 :避免启动卡顿,提升用户体验;
        3. 信号驱动导航 :解耦页面与控制器,提高可维护性;
        4. Qt Designer + PyUIC :实现 UI 与逻辑分离,提升开发效率;
        5. 状态管理替代全局变量 :让数据流动更清晰、更安全;
        6. PyInstaller 打包发布 :交付即用型产品,无需依赖环境。

        这套组合拳下来,哪怕你的项目从一个小工具慢慢长成一个复杂系统,也能稳如老狗。

        记住一句话: 好的架构不是一开始设计出来的,而是在一次次迭代中坚持原则演化出来的 。别怕麻烦,先把架子搭正,后面的路才会越走越宽。

        以上就是PyQt5实现多界面自由切换的完整项目实践指南的详细内容,更多关于PyQt5界面切换的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • PyQt5使用QtDesigner实现多界面切换程序的全过程
        • python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
        • PyQt实现界面翻转切换效果
        • PyQt5利用Qt Designer实现简单界面交互
        • PyQt5界面无响应的解决方案
        • PyQt界面阻塞卡死问题的解决

        站内搜索