第三章 记事本主窗口基础

在本章我们会分析记事本主窗口的界面元素,然后使用PySide6实现记事本主窗口界面。

3.1界面分析

见下图
界面分析

3.1.1 菜单栏

PySide6PySide6.QtWidgets.QMenuBar类用于创建菜单栏
记事本中菜单栏包含如下元素:

  • 菜单(QMenu) 如:文件菜单
  • 菜单项 如:点击文件菜单后显示的
  • 子菜单(QMenu) 如: 查看菜单里的 缩放子菜单
  • 行为(QAction) 如:文件菜单 打开行为
  • 分割线(QAction) 使用(QMenu.addSeparator()方法创建)

注意:这里只是简单分析,后面会仔细讲解

参考菜单栏的组成控件

3.1.2 文本编辑

PySide6PySide6.QtWidgets.QTextEditPySide6.QtWidgets.QPlainTextEdit类用于创建文本编辑/纯文本编辑器

3.1.3 状态栏

PySide6PySide6.QtWidgets.QStatusBar类用于创建状态栏

3.2主窗口

上边描述的菜单栏、按钮栏目、在主窗口(QMainWindow)中都可在主窗口中快速创建

3.2.1 主窗口框架

QMainWindow框架
由图可见该框架包含:

  1. 菜单栏(QMenuBar)
  2. 工具栏(QToolBar)
  3. 中心窗口(QWidget) 使用QMainWindow.setCentralWidget方法创建
  4. 状态栏(QStatusBar)

是不是完美契合记事本的主窗口?那我们就基于QMainWindow写一个与记事本主界面相似的窗口。

3.3 QMainWindow 实现记事本主窗口

笔者会借助面向对象编程(类,继承等知识)来编写一个记事本主窗口界面。

注意:没有学习面向对象编程知识的读者,建议阅读菜鸟教程的相关内容

3.3.1 代码实现

主要控件与实现:

  • 菜单栏:借助QMainWindow.menuBar()方法来快速创建一个菜单栏
  • 纯文本编辑:实例化一个QTextEdit对象 并使用 QMainWindows.setCentralWidget()方法将其加入
  • 状态栏:借助QMainWindow.statusBar()方法来快速创建一个菜单栏

常见问题:为什么不使用QTextEdit?因为win10的记事本是一个纯文本编辑器。

from PySide6.QtWidgets import QMainWindow,QPlainTextEdit,QApplication
import sys

class NotePadMain(QMainWindow):
    """记事本主界面

    :param QMainWindow: 主窗口
    """
    def __init__(self):
        """初始化
        """
        super().__init__()
        self.setupUi()

    def setupUi(self):
        """设置用户界面
        """
        # 设置窗口标题
        self.setWindowTitle("记事本主界面")

        # 创建菜单栏
        menubar = self.menuBar()

        # 添加文件菜单
        menubar.addMenu("文件(&F)")

        # 示例化纯文本编辑 
        plain_text_edit = QPlainTextEdit()

        # 添加纯文本编辑到 中心窗口
        self.setCentralWidget(plain_text_edit)

        # 添加状态栏目
        self.statusBar()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    notepad_main = NotePadMain()
    notepad_main.show()
    sys.exit(app.exec())

常见问题: 看不懂未注释部分的读者 点击查看

3.3.2 代码解读

主要有俩个问题:

  1. 为什么要创建setupUi()方法? 这是参考QtDesigner文件转为Python文件的部分代码
  2. "文件(&F)"里的 &什么作用?指定F被用作键盘快捷方式 按下Alt + F 会按下该菜单按钮

3.3.3效果演示

fedora42_gnome48_wayland
gnome48
Kubuntu24.04_KDE5.27.12_x11 待更新

Win10工作站版 待更新

3.3.4 代码优化

可以看到主窗口QMainWindow中心控件centralWidget的边缘有一个虚线。这影响了一定的视觉效果。

优化方案:

  • 借助PySide6.QtWidgets.QFrame.setFrameShape()方法的QFrame.Shape.NoFrame属性来实现

效果:
gnome48

参考: QFrame.setFrameShape()方法 | QFrame.Shape

from PySide6.QtWidgets import QMainWindow,QPlainTextEdit,QFrame,QApplication
import sys

class NotePadMain(QMainWindow):
    """记事本主界面

    :param QMainWindow: 主窗口
    """
    def __init__(self):
        """初始化
        """
        super().__init__()
        self.setupUi()

    def setupUi(self):
        """设置用户界面
        """
        # 创建菜单栏
        menubar = self.menuBar()

        # 添加文件菜单
        menubar.addMenu("文件(&F)")

        # 示例化纯文本编辑 
        plain_text_edit = QPlainTextEdit()
        
        # 消除框线
        plain_text_edit.setFrameShape(QFrame.Shape.NoFrame)

        # 添加纯文本编辑到 中心窗口
        self.setCentralWidget(plain_text_edit)

        # 添加状态栏目
        self.statusBar()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    notepad_main = NotePadMain()
    notepad_main.show()
    sys.exit(app.exec())

小技巧: 如何判断一个窗口是否有状态栏(QStatusBar)?有状态栏的窗口右下角有标志

本章小结

在本章我们分析并实现了一个简单的记事本主界面。

小试牛刀

在本章讲述代码的基础上,再添加多个菜单,让菜单栏看起来和记事本一样!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐