PyQt5 – 多文档界面

  • Post category:Python

PyQt5是一个基于Python的GUI开发框架,允许我们创建美观且易于使用的交互式桌面应用程序。在本文中,我们将详细介绍如何使用PyQt5来创建多文档界面,以及如何管理和显示多个文档。

创建一个多文档界面

我们可以使用QMainWindow类来创建一个主窗口,并使用QMdiArea类来管理多个子窗口。以下是完整的Python代码:

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

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 设置主窗口的标题
        self.setWindowTitle('多文档界面')

        # 创建QMdiArea对象
        mdi = QMdiArea()

        # 将QMdiArea对象设置为主窗口的中心窗口
        self.setCentralWidget(mdi)

        # 创建两个子窗口
        sub1 = QMdiSubWindow()
        sub2 = QMdiSubWindow()

        # 将两个子窗口添加到QMdiArea中
        mdi.addSubWindow(sub1)
        mdi.addSubWindow(sub2)

        # 在子窗口中添加一个文本编辑框
        text1 = QTextEdit()
        text2 = QTextEdit()
        sub1.setWidget(text1)
        sub2.setWidget(text2)

        # 显示子窗口
        sub1.show()
        sub2.show()

# 创建一个QApplication对象
app = QApplication(sys.argv)

# 创建主窗口
window = MainWindow()

# 显示主窗口
window.show()

# 运行应用程序
sys.exit(app.exec_())

在上面的示例中,我们先创建了一个QMdiArea对象并将其设置为主窗口的中心窗口。然后我们创建了两个子窗口并将它们添加到QMdiArea中。我们还在每个子窗口中添加了一个QTextEdit对象,然后显示了所有的子窗口。请注意,QMdiSubWindow默认是不可调整大小的,如果需要调整大小,可以使用sub.setWidgetResizable(True)来实现。

打开和保存文档

在上面的示例中,我们已经创建了两个空的文本编辑框,但是我们如何打开和保存文档呢?以下是解决方案:

import os
from PyQt5.QtWidgets import QFileDialog, QAction

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # ...

        # 创建一个"打开"动作
        open_action = QAction('打开', self)
        open_action.triggered.connect(self.open_file)

        # 创建一个"保存"动作
        save_action = QAction('保存', self)
        save_action.triggered.connect(self.save_file)

        # 添加"打开"和"保存"操作
        file_menu = self.menuBar().addMenu('文件')
        file_menu.addAction(open_action)
        file_menu.addAction(save_action)

    def open_file(self):
        # 显示打开文件对话框,并获取文件名
        filename, _ = QFileDialog.getOpenFileName(self, '打开文件')

        # 如果文件名不为空
        if filename:
            # 打开文件,并将文件内容显示在当前活动的QMdiSubWindow的QTextEdit中
            with open(filename, 'r') as f:
                text = f.read()
                self.active_text_edit().setPlainText(text)

    def save_file(self):
        # 获取当前活动的QMdiSubWindow中的QTextEdit对象
        text_edit = self.active_text_edit()

        # 如果当前QMdiSubWindow中有QTextEdit对象
        if text_edit:
            # 显示保存文件对话框,并获取文件名
            filename, _ = QFileDialog.getSaveFileName(self, '保存文件')

            # 如果文件名不为空
            if filename:
                # 将QTextEdit中的文本保存到文件中
                with open(filename, 'w') as f:
                    f.write(text_edit.toPlainText())

    def active_text_edit(self):
        # 获取当前活动的QMdiSubWindow
        sub = self.centralWidget().currentSubWindow()

        # 如果存在QMdiSubWindow
        if sub:
            # 获取QMdiSubWindow中的QTextEdit对象
            return sub.widget()

        return None

在上面的代码中,我们创建了”打开”和”保存”两个操作,并将它们添加到文件菜单中。当用户点击”打开”操作时,我们使用 QFileDialog来打开一个文件选择对话框,并读取所选文件的文本内容,并将其显示在当前活动的QMdiSubWindow的QTextEdit中。当用户点击”保存”操作时,我们先获取当前QMdiSubWindow中的QTextEdit对象,然后使用QFileDialog来打开一个保存文件对话框,并将QTextEdit中的文本保存到所选文件中。

示例

以下是一些示例代码,演示如何创建和操作多文档界面。

示例1:创建一个空文档

sub = QMdiSubWindow()
mdi.addSubWindow(sub)

text_edit = QTextEdit()
sub.setWidget(text_edit)

# 显示子窗口
sub.show()

在上面的示例中,我们创建了一个QMdiSubWindow并将其添加到QMdiArea中。然后我们在QMdiSubWindow中添加了一个QTextEdit对象,并将其显示在QMdiSubWindow中。最后我们显示了QMdiSubWindow。

示例2:关闭所有打开的文档

mdi.closeAllSubWindows()

在上面的示例中,我们使用closeAllSubWindows()函数来关闭所有打开的QMdiSubWindow。

综上所述,上述示例足以说明使用PyQt5来创建和操作多文档界面。