5.1.1框架:QFrame

框架控件属于QFrame类,用于对窗口部分控件进行分隔。QFrame类的常用方法如下:

setFrameShape():设置分隔线方向,取值如下:

HLine:水平分割线

VLine:垂直分割线

setFrameStyle():设置分隔线样式(QFrame.Shape.X):  

  NoFrame:无分隔线    Box:方块分隔线    Panel:面板    StyledPanel:面板风格

SetFrameShadow():设置分隔线的显示阴影(QFrame.Shape.X),取值如下: Sunken:有边框阴影,并且下沉显示,这是默认设置

Plain:无阴影

Raised:有边框阴影,并且凸起显示

setLineWidth():设置分隔线的宽度

setMidLineWidth():设置分隔线的中间线宽度

【例5.1】QFrame分隔测试,测试如下:

import sys  # 导入Python标准库sys,用于处理与Python解释器相关的操作

from PyQt6.QtWidgets import *  # 从PyQt6的QtWidgets模块中导入所有类和功能


class MyWidget(QWidget):  # 定义一个名为MyWidget的类,继承自QWidget

    def __init__(self):  # 定义MyWidget类的构造函数
        super(MyWidget, self).__init__()  # 调用父类QWidget的构造函数,完成基本的初始化
        self.setFixedSize(500, 350)  # 设置窗口的固定大小为500x350像素
        self.setWindowTitle("QFrame测试")  # 设置窗口的标题为"QFrame测试"

        # 创建一个QFrame对象并设置其属性
        self.frame = QFrame()
        self.frame.setFrameStyle(QFrame.Shape.Panel)  # 设置框架的样式为面板样式
        self.frame.setLineWidth(1)  # 设置框架的线宽为1像素
        self.frame.setMidLineWidth(1)  # 设置框架中间部分的线宽为1像素
        self.frame.setFixedSize(480, 200)  # 设置框架的固定大小为480x200像素

        # 创建一个垂直布局,并设置到MyWidget上
        self.vLayout = QVBoxLayout(self)
        self.vLayout.addSpacing(10)  # 在布局中添加10像素的间距
        self.vLayout.addWidget(self.frame)  # 将框架添加到垂直布局中
        self.vLayout.addSpacing(20)  # 在布局中添加20像素的间距
        self.vLayout.addStretch()  # 添加一个伸缩空间,使布局更加灵活

        # 创建并配置按钮和组合框
        self.btn1 = QPushButton("设置LineWidth")  # 创建按钮,用于设置线宽
        self.btn2 = QPushButton("设置MidLineWidth")  # 创建按钮,用于设置中间线宽
        self.btn3 = QPushButton("设置FrameShape")  # 创建按钮,用于设置框架样式
        self.btn4 = QPushButton("设置FrameShadow")  # 创建按钮,用于设置框架阴影(但代码中并未使用此按钮的全部功能)

        self.cb1 = QComboBox()  # 创建下拉组合框,用于选择线宽
        self.cb1.addItems(["1", "2", "3"])  # 为组合框添加选项1、2、3
        self.cb2 = QComboBox()  # 创建下拉组合框,用于选择中间线宽
        self.cb2.addItems(["1", "2", "3"])  # 为组合框添加选项1、2、3
        self.cb3 = QComboBox()  # 创建下拉组合框,用于选择框架样式
        self.cb3.addItems(["NoFrame", "Box", "Panel", "StyledPanel"])  # 为组合框添加框架样式的选项
        self.cb4 = QComboBox()  # 创建下拉组合框,用于选择框架阴影(但代码中并未使用此组合框的全部功能)
        self.cb4.addItems(["Plain", "Raised", "Sunken"])  # 为组合框添加框架阴影的选项

        # 创建并配置水平布局
        hLayout1 = QHBoxLayout()  # 创建第一个水平布局
        hLayout1.addWidget(QLabel("LineWidth: "))  # 添加标签到水平布局
        hLayout1.addWidget(self.cb1)  # 添加线宽组合框到水平布局
        hLayout1.addWidget(self.btn1)  # 添加设置线宽按钮到水平布局
        self.vLayout.addLayout(hLayout1)  # 将水平布局添加到垂直布局中

        hLayout2 = QHBoxLayout()  # 创建第二个水平布局
        hLayout2.addWidget(QLabel("MidLineWidth: "))  # 添加标签到水平布局
        hLayout2.addWidget(self.cb2)  # 添加中间线宽组合框到水平布局
        hLayout2.addWidget(self.btn2)  # 添加设置中间线宽按钮到水平布局
        self.vLayout.addLayout(hLayout2)  # 将水平布局添加到垂直布局中

        hLayout3 = QHBoxLayout()  # 创建第三个水平布局
        hLayout3.addWidget(QLabel("FrameShape: "))  # 添加标签到水平布局
        hLayout3.addWidget(self.cb3)  # 添加框架
        # 添加设置线宽的按钮到水平布局hLayout3
        hLayout3.addWidget(self.btn3)  # 将按钮添加到水平布局中
        # 将水平布局hLayout3添加到垂直布局vLayout中
        self.vLayout.addLayout(hLayout3)  # 在垂直布局中嵌套水平布局

        # 创建一个新的水平布局对象hLayout4
        hLayout4 = QHBoxLayout()  # 初始化一个新的水平布局
        # 在水平布局hLayout4中添加一个标签,标签内容为"FrameShadow: "
        hLayout4.addWidget(QLabel("FrameShadow: "))  # 添加标签到水平布局
        # 在水平布局hLayout4中添加一个组合框self.cb4
        hLayout4.addWidget(self.cb4)  # 添加组合框到水平布局
        # 在水平布局hLayout4中添加一个按钮self.btn4
        hLayout4.addWidget(self.btn4)  # 添加按钮到水平布局
        # 将水平布局hLayout4添加到垂直布局self.vLayout中
        self.vLayout.addLayout(hLayout4)  # 在垂直布局中嵌套另一个水平布局

        # 连接按钮self.btn1的clicked信号到self.setLineWidth槽函数
        self.btn1.clicked.connect(self.setLineWidth)  # 当按钮被点击时,调用setLineWidth方法
        # 连接按钮self.btn2的clicked信号到self.setMidLineWidth槽函数
        self.btn2.clicked.connect(self.setMidLineWidth)  # 当按钮被点击时,调用setMidLineWidth方法
        # 连接按钮self.btn3的clicked信号到self.setFrameShape槽函数
        self.btn3.clicked.connect(self.setFrameShape)  # 当按钮被点击时,调用setFrameShape方法
        # 连接按钮self.btn4的clicked信号到self.setFrameShadow槽函数
        self.btn4.clicked.connect(self.setFrameShadow)  # 当按钮被点击时,调用setFrameShadow方法

    def setLineWidth(self):
        # 从组合框cb1中获取当前选中的文本,并将其转换为整数
        value = int(self.cb1.currentText())
        # 设置框架frame的线宽为value
        self.frame.setLineWidth(value)

        # 这个方法用于设置框架的线宽,用户通过组合框选择线宽的值,然后该值被用来设置框架的实际线宽。

    def setMidLineWidth(self):
        # 从组合框cb2中获取当前选中的文本,并将其转换为整数
        value = int(self.cb2.currentText())
        # 设置框架frame的中间线宽为value
        self.frame.setMidLineWidth(value)

        # 这个方法用于设置框架的中间线宽,与setLineWidth类似,但它是设置中间部分的线宽。

    def setFrameShape(self):
        # 检查组合框cb3当前选中的文本
        if self.cb3.currentText() == "NoFrame":
            # 如果选中的是"NoFrame",则设置框架frame的样式为无框架
            self.frame.setFrameStyle(QFrame.Shape.NoFrame)
        elif self.cb3.currentText() == "Box":
            # 如果选中的是"Box",则设置框架frame的样式为Box
            self.frame.setFrameStyle(QFrame.Shape.Box)
        elif self.cb3.currentText() == "Panel":
            # 如果选中的是"Panel",则设置框架frame的样式为Panel
            self.frame.setFrameStyle(QFrame.Shape.Panel)
        elif self.cb3.currentText() == "StyledPanel":
            # 如果选中的是"StyledPanel",则设置框架frame的样式为StyledPanel
            self.frame.setFrameStyle(QFrame.Shape.StyledPanel)

            # 这个方法用于设置框架的样式,用户通过组合框选择框架的样式,然后该样式被用来设置框架的实际外观。

    def setFrameShadow(self):
        # 检查组合框cb4当前选中的文本
        if self.cb4.currentText() == "Plain":
            # 如果选中的是"Plain",则设置框架frame的阴影效果为无阴影
            self.frame.setFrameShadow(QFrame.Shape.Plain)
        elif self.cb4.currentText() == "Raised":
            # 如果选中的是"Raised",则设置框架frame的阴影效果为凸起
            self.frame.setFrameShadow(QFrame.Shape.Raised)
        elif self.cb4.currentText() == "Sunken":
            # 如果选中的是"Sunken",则设置框架frame的阴影效果为凹陷
            self.frame.setFrameShadow(QFrame.Shape.Sunken)

            # 这个方法用于设置框架的阴影效果,用户通过组合框选择阴影效果,然后该效果被用来设置框架的3D视觉效果。


if __name__ == '__main__':
    # 检查当前脚本是否作为主程序运行。如果是,则执行以下代码块。
    # 如果这个脚本是被其他脚本导入的,那么这部分代码不会被执行。

    app = QApplication(sys.argv)
    # 创建一个QApplication对象,这是所有Qt GUI应用程序的基础。
    # sys.argv是命令行参数列表,通常用于接收用户从命令行输入的参数。

    w = MyWidget()
    # 创建一个MyWidget类的实例,MyWidget类应该是自定义的Qt窗口部件类。
    # 假设MyWidget类继承自QWidget或其子类,用于创建应用程序的主窗口或部件。

    w.show()
    # 显示MyWidget窗口部件。这会使得窗口在屏幕上可见。
    # 如果不调用show方法,窗口将不会被显示出来。

    sys.exit(app.exec())
    # 进入Qt应用程序的主事件循环。这是GUI应用程序的核心,用于接收和处理用户输入、窗口事件等。
    # app.exec()将返回一个整数,通常用于表示应用程序的退出状态。
    # sys.exit()确保Python解释器在Qt应用程序退出后也退出,并返回应用程序的退出状态。

实现了一个具有交互功能的简单图形用户界面(GUI)应用程序。该程序允许用户通过一系列控件动态地改变一个框架(QFrame)的外观属性,包括线宽、中线宽、框架形状和框架阴影。

功能:

  • 用户可以通过下拉框(QComboBox)选择框架的线宽和中线宽。
  • 用户可以通过另一个下拉框选择框架的形状(无框架、盒子、面板、样式面板)。
  • 用户可以通过最后一个下拉框选择框架的阴影样式(平面、凸起、凹陷)。
  • 每次用户从下拉框中选择一个选项时,都会立即更新框架的外观以反映新的设置。

布局:

  • 垂直布局 (QVBoxLayout):作为主布局,用于组织窗口中的其他部件。
  • 水平布局 (QHBoxLayout):用于组织每个下拉框和对应的标签按钮,使其在同一行上显示。

控件:

  • QFrame:用于显示一个可配置的框架,其外观由用户通过其他控件设置。
  • QLabel:用于显示文本标签,描述每个下拉框的用途。
  • QComboBox:下拉框,用于让用户从预定义的选项中选择一个值。
  • QPushButton:按钮,用于触发相应的槽函数,尽管在提供的代码中并未看到按钮的创建和使用,但从连接信号和槽的语句中可以推断出应该存在按钮。

关键语句:

  1. 信号和槽的连接

    self.btnX.clicked.connect(self.setSomeProperty)

    这些语句将按钮的点击事件(clicked 信号)与对应的槽函数(如 setLineWidthsetMidLineWidthsetFrameShapesetFrameShadow)连接起来。当用户点击按钮时,会执行相应的槽函数,从而改变 QFrame 的属性。

  2. 属性设置

    self.frame.setLineWidth(value)  
    self.frame.setMidLineWidth(value)  
    self.frame.setFrameStyle(QFrame.Shape.SomeShape)  
    self.frame.setFrameShadow(QFrame.Shape.SomeShadow)

    这些语句根据下拉框的当前选择来设置 QFrame 的属性。它们是关键的部分,因为它们直接改变了 GUI 的视觉表现。

  3. 下拉框选项检查
    在 setFrameShape 和 setFrameShadow 方法中,通过检查下拉框的当前文本来设置 QFrame 的形状和阴影样式。这些条件语句确保正确的属性被应用于框架。

  4. 程序入口

    if __name__ == '__main__':  
        app = QApplication(sys.argv)  
        w = MyWidget()  
        w.show()  
        sys.exit(app.exec())

    这些是运行 PyQt6 应用程序的标准代码。它们创建应用程序实例,显示窗口部件,并进入事件循环以等待用户交互。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐