在上一篇文章中,我们探讨了如何实现多窗口应用中的窗口间通信。这一篇将带领大家使用“MDI”(多个文档界面)模式来创建一个多窗口应用程序,MDI 允许多个子窗口在主窗口中同时显示,这样用户可以在同一主窗口中处理多个文档。
什么是MDI?
MDI是一种用户界面设计,允许一个主窗口同时打开多个子窗口。用户可以在主窗口中管理这些子窗口,与此同时,每个子窗口可以独立编辑。
创建MDI应用
在这一部分,我们将使用PyQt5来创建一个简单的MDI应用程序。我们将实现一个主窗口,可以创建多个子窗口,每个子窗口都可以编辑文本。
步骤1:安装 PyQt5
首先,确保已经安装PyQt5。如果还未安装,可以使用以下命令:
步骤2:创建基本的MDI主窗口
接下来,我们将创建一个基本的MDI主窗口。在这个窗口中,我们将添加菜单项以创建子窗口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| 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)
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:子窗口的功能扩展
我们还可以增强子窗口的功能,比如添加保存、关闭等操作。这里我们将实现“保存”功能,让用户可以将编辑的内容保存到文件。
添加一个“保存”菜单到子窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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应用!