Jupyter AI

25 PyQt5小白教程系列:创建多窗口应用

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

分类: 🖥️PyQt5 必备

👁️阅读: --

在前一篇教程中,我们探讨了如何在PyQt5中进行自定义事件处理,了解事件是如何被触发和处理的。在这一节中,我们将重点学习如何创建一个简单的多窗口应用程序。在之后的教程中,我们还会讨论窗口之间的通信。这将使我们能够构建更复杂的应用程序。

多窗口应用基本概念

在PyQt5中,创建一个多窗口应用主要涉及以下几个步骤:

  1. 创建多个窗口类:每个窗口通常是一个QWidget的子类。
  2. 管理窗口显示:通过创建窗口实例并控制其显示来管理多个窗口。
  3. 交互设计:创建能够打开新窗口的按钮和其他控件。

示例应用:多窗口文本编辑器

接下来,我们将通过创建一个简单的文本编辑器示例,来实现一个多窗口应用。这些窗口包括主窗口和一个用于编辑的子窗口。

第一步:创建主窗口

首先,我们创建一个主窗口,它包含一个按钮,当点击此按钮时,打开一个文本编辑窗口。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QTextEdit, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        self.setGeometry(100, 100, 400, 300)

        self.initUI()

    def initUI(self):
        button = QPushButton("打开文本编辑窗口", self)
        button.clicked.connect(self.openTextEditWindow)
        
        layout = QVBoxLayout()
        layout.addWidget(button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def openTextEditWindow(self):
        self.textEditWindow = TextEditWindow()
        self.textEditWindow.show()

class TextEditWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("文本编辑窗口")
        self.setGeometry(150, 150, 300, 200)
        
        self.initUI()

    def initUI(self):
        self.textEdit = QTextEdit(self)
        self.setCentralWidget(self.textEdit)

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

代码讲解

  1. 主窗口 (MainWindow):它是整个应用程序的主界面,初始化时设置窗口标题和尺寸,并创建一个按钮。
  2. 打开子窗口:当点击按钮时,openTextEditWindow方法会被调用,进而创建TextEditWindow类的实例,并显示它。
  3. 文本编辑窗口 (TextEditWindow):这是一个简单的文本编辑器,使用QTextEdit组件来允许用户输入文本。

第二步:添加更多窗口

接下来,假设我们想添加另一个窗口来展示当前文本的内容。可以通过在TextEditWindow中添加一个按钮来实现这个功能,点击此按钮会打开一个显示文本的窗口。

更新 TextEditWindow

class TextEditWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("文本编辑窗口")
        self.setGeometry(150, 150, 300, 200)

        self.initUI()

    def initUI(self):
        self.textEdit = QTextEdit(self)
        self.setCentralWidget(self.textEdit)

        # 添加按钮显示文本
        show_button = QPushButton("显示文本", self)
        show_button.clicked.connect(self.showTextWindow)

        layout = QVBoxLayout()
        layout.addWidget(self.textEdit)
        layout.addWidget(show_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def showTextWindow(self):
        textToShow = self.textEdit.toPlainText()  # 获取文本内容
        self.textDisplayWindow = TextDisplayWindow(textToShow)
        self.textDisplayWindow.show()

class TextDisplayWindow(QMainWindow):
    def __init__(self, text):
        super().__init__()
        self.setWindowTitle("显示文本窗口")
        self.setGeometry(200, 200, 300, 200)

        label = QTextEdit()
        label.setPlainText(text)
        label.setReadOnly(True)  # 只读

        self.setCentralWidget(label)

新增代码讲解

  1. 按钮显示文本:在TextEditWindow中添加了一个新的按钮show_button,用于显示文本。
  2. 展示文本的新窗口:创建了一个新的窗口TextDisplayWindow来展示用户在QTextEdit中输入的文本内容。

总结

在这一节中,我们成功创建了一个多窗口应用,用户可以从主窗口打开文本编辑窗口,并在编辑窗口中输入内容,最后通过点击按钮在新窗口中查看这些文本。这样不仅了解了如何生成多窗口应用,也为下篇窗口间的通信打下了基础。

在接下来的教程中,我们将探讨如何让这些窗口之间进行通信,使得它们能够更好地协作,形成更为复杂的应用逻辑。保持关注!