Osheep

时光不回头,当下最重要。

PyQt5中MidArea的使用


子窗口打开需求

在PyQt5中,使用MidArea进行打开子窗口

子窗口打开需求

  1. 每个子窗口只能在同一个MidArea中打开一个,如果之前已打开则进行显示到最前面
  2. 进行关闭子窗口后,可重新打开

代码实现

1、基础子窗口代码

  • 实现公共逻辑,比如关闭窗口
from PyQt5.QtWidgets import QMdiSubWindow
class BaseMidSubWindow(QMdiSubWindow):
    # midArea子窗口自定义基类

    def __init__(self, parent=None):
        super(BaseMidSubWindow, self).__init__(parent)
        self.parent = parent

    def closeEvent(self, event):
        """重写close事件"""
        self.parent.removeSubWindow(self)

2、各业务子窗口,集成BaseMidSubWindow进行实现

  • 这里使用一个子窗口进行演示
from PyQt5 import uic
from PyQt5.Qt import Qt
"""这个baseWdigets请替换为你本地的"""
from controller.common.baseWdigets import BaseMidSubWindow

class UserListWindow(BaseMidSubWindow):
    # midArea子窗口
    # 用户列表窗口

    def __init__(self, parent=None):
        super(UserListWindow, self).__init__(parent)
        # 加载UI文件
        self.ui = uic.loadUi("./ui/user_list.ui")
        # 向sub内添加内部控件
        self.setWidget(self.ui)
        # 显示尺寸
        self.resize(500, 350)
        self.register_event()

        # 加载数据
        # self.load_data()

    def register_event(self):
        """注册事件"""
        pass

3、在主窗口MidArea处进行使用

  • 点击某个按钮或菜单时,触发打开UserListWindow子窗口的操作
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QIcon
"""这里大家替换为自己存储窗口的配置"""
from controller.mf178.windows import *

class StartUpWindow(object):
    def __init__(self):
        self.ui = uic.loadUi("./ui/main.ui")
        self.register_event()
        self.ui.show()

    def register_event(self):
        """注册事件"""
        # 打开用户列表窗口,这里可以优化为配置方式
        self.ui.action_user.triggered.connect(self.show_user_list_window)

    def open_win(self, target_win, is_new=False):
        """midarea打开子窗口的逻辑"""
        # 获取所有子窗口
        win_list = self.ui.mdiArea.subWindowList()
        # 根据窗口名称判断窗口是否存在
        match_win = None
        for win in win_list:
            if type(win) == type(target_win):
                # 存在一样的窗口
                match_win = win
                break

        # 存在则激活,不存在则新增
        if match_win is not None and is_new is False:
            # 激活窗口
            self.ui.mdiArea.setActiveSubWindow(match_win)
        else:
            # 将子窗口添加到Mdi区域
            self.ui.mdiArea.addSubWindow(target_win)
            # 直接展示
            target_win.show()

    def show_user_list_window(self):
        """显示窗口"""
        user_list_win = UserListWindow(self.ui.mdiArea)
        # 打开或激活窗口
        self.open_win(user_list_win)


if __name__ == '__main__':
    app = QApplication([])
    # 设置图标
    # app.setWindowIcon(QIcon("./assets/images/logo.png"))
    win = StartUpWindow()
    sys.exit(app.exec_())

— 本文完 —

点赞