27 使用MDI实现多窗口应用
在上一篇文章中,我们探讨了如何实现多窗口应用中的窗口间通信。这一篇将带领大家使用“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应用!