Jupyter AI

27 使用MDI实现多窗口应用

📅 发表日期: 2024年8月10日

分类: 🖥️PyQt5 必备

👁️阅读: --

在上一篇文章中,我们探讨了如何实现多窗口应用中的窗口间通信。这一篇将带领大家使用“MDI”(多个文档界面)模式来创建一个多窗口应用程序,MDI 允许多个子窗口在主窗口中同时显示,这样用户可以在同一主窗口中处理多个文档。

什么是MDI?

MDI是一种用户界面设计,允许一个主窗口同时打开多个子窗口。用户可以在主窗口中管理这些子窗口,与此同时,每个子窗口可以独立编辑。

创建MDI应用

在这一部分,我们将使用PyQt5来创建一个简单的MDI应用程序。我们将实现一个主窗口,可以创建多个子窗口,每个子窗口都可以编辑文本。

步骤1:安装 PyQt5

首先,确保已经安装PyQt5。如果还未安装,可以使用以下命令:

pip install PyQt5

步骤2:创建基本的MDI主窗口

接下来,我们将创建一个基本的MDI主窗口。在这个窗口中,我们将添加菜单项以创建子窗口。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QAction, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("MDI 多窗口应用")
        self.setGeometry(100, 100, 800, 600)

        # 创建MDI区域
        self.mdi_area = QMdiArea()
        self.setCentralWidget(self.mdi_area)

        # 添加菜单
        self.create_menu()

    def create_menu(self):
        menu_bar = self.menuBar()

        # 创建窗口菜单
        window_menu = menu_bar.addMenu("窗口")
        
        # 添加子窗口创建动作
        new_window_action = QAction("新建子窗口", self)
        new_window_action.triggered.connect(self.create_sub_window)
        window_menu.addAction(new_window_action)

    def create_sub_window(self):
        sub_window = QMdiSubWindow()
        sub_window.setWindowTitle("子窗口")
        text_edit = QTextEdit()
        sub_window.setWidget(text_edit)
        self.mdi_area.addSubWindow(sub_window)
        
        # 显示子窗口
        sub_window.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

解释代码

  • 我们创建了一个MainWindow类,继承自QMainWindow
  • 使用QMdiArea来创建一个多文档界面区域。
  • 在菜单栏添加了一个“窗口”菜单,具有“新建子窗口”的选项。
  • 创建子窗口时,我们使用QMdiSubWindow,并在其中放置了一个QTextEdit以允许用户编辑文本。
  • 新建的子窗口会被添加到MDI区域,并通过调用show()方法显示。

步骤3:子窗口的功能扩展

我们还可以增强子窗口的功能,比如添加保存、关闭等操作。这里我们将实现“保存”功能,让用户可以将编辑的内容保存到文件。

添加一个“保存”菜单到子窗口:

# 在 MainWindow 类中,创建子窗口时添加保存动作
def create_sub_window(self):
    sub_window = QMdiSubWindow()
    sub_window.setWindowTitle("子窗口")
    text_edit = QTextEdit()
    sub_window.setWidget(text_edit)

    # 添加保存动作
    save_action = QAction("保存", sub_window)
    save_action.triggered.connect(lambda: self.save_file(text_edit))
    sub_window.menuBar().addAction(save_action)

    self.mdi_area.addSubWindow(sub_window)
    sub_window.show()

def save_file(self, text_edit):
    # 保存文件的逻辑
    file_name, _ = QFileDialog.getSaveFileName(self, "保存文件", "", "文本文件 (*.txt);;所有文件 (*)")
    if file_name:
        with open(file_name, 'w') as f:
            f.write(text_edit.toPlainText())

在这个示例中,我们为每个子窗口添加了一个“保存”动作。当用户点击保存时,将调用save_file方法,弹出文件选择对话框,并将文本保存到选定的文件中。

总结

通过这个示例,我们使用 PyQt5 创建了一个简单的 MD I多窗口应用。我们实现了创建子窗口和保存文本的基本功能。在下一篇文章中,我们将进一步探讨如何打包和发布这个应用程序。

MDI 为用户提供了方便的多文档管理功能,为我们的应用程序增加了灵活性。希望以上的代码示例能够帮助你更好地理解和实现MDI应用!