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
:按钮,用于触发相应的槽函数,尽管在提供的代码中并未看到按钮的创建和使用,但从连接信号和槽的语句中可以推断出应该存在按钮。
关键语句:
-
信号和槽的连接:
self.btnX.clicked.connect(self.setSomeProperty)
这些语句将按钮的点击事件(
clicked
信号)与对应的槽函数(如setLineWidth
,setMidLineWidth
,setFrameShape
,setFrameShadow
)连接起来。当用户点击按钮时,会执行相应的槽函数,从而改变QFrame
的属性。 -
属性设置:
self.frame.setLineWidth(value) self.frame.setMidLineWidth(value) self.frame.setFrameStyle(QFrame.Shape.SomeShape) self.frame.setFrameShadow(QFrame.Shape.SomeShadow)
这些语句根据下拉框的当前选择来设置
QFrame
的属性。它们是关键的部分,因为它们直接改变了 GUI 的视觉表现。 -
下拉框选项检查:
在setFrameShape
和setFrameShadow
方法中,通过检查下拉框的当前文本来设置QFrame
的形状和阴影样式。这些条件语句确保正确的属性被应用于框架。 -
程序入口:
if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.show() sys.exit(app.exec())
这些是运行 PyQt6 应用程序的标准代码。它们创建应用程序实例,显示窗口部件,并进入事件循环以等待用户交互。