容器类控件不能输人输出数据,通常作为常用控件的载体,将常用控件"放置"到其内部。
容器控件对放到其内部的控件进行管理,并成为控件的父控件。
常用的容器控件如表所示:
容器控件类 | 中文名 |
---|---|
QGroupBox | 分组框控件 |
QFrame | 框架控件 |
QScrollArea | 滚动区控件 |
QTabWidget | 切换卡控件 |
QStackedWidget | 控件栈控件 |
QToolBox | 工具箱控件 |
QWidget | 容器窗口控件 |
QMdiArea | 多文档区 |
QDockWidget | 停靠窗口控件 |
QAxWidget | 插件窗口控件 |
框架控件(帧窗口)QFrame
框架控件 QFrame作为容器可以在其内部放置各种可视控件。
QFrame没有属于自己特有的信号和槽函数,一般不接受用户的输人,它只能提供一个外形.可以设置外形的样式线宽等。
QFrame作为父类被其他一些控件所继承,这些控件如QAbstractScrollArea、QLabel、QLCDNumber,QSplitter、QStackedWidget 和 QToolBox 等
from PySide6.QtWidgets import QFrame
QFrame(parent: Union[PySide6.QtWidgets.QWidget,NoneType] = None,f: PySide6.QtCore.Qt.WindowType = Default(Qt.WindowFlags))-> None
QMenu使用此功能将菜单"提升"到周围屏幕上方。QProgressBar具有"凹陷"的外观。QLabel外观扁平。像这样的小部件的框架是可以更改的。
label = QLabel(...)
label.setFrameStyle(QFrame.Panel | QFrame.Raised)
label.setLineWidth(2)
pbar = QProgressBar(...)
label.setFrameStyle(QFrame.NoFrame)
QFrame类也可以直接用于创建没有任何内容的简单占位符框架。
框架样式由框架形状和阴影样式指定,阴影样式用于在视觉上将框架与周围的小部件分离。可以使用setFrameStyle()函数将这些财产设置在一起,并使用frameStyle()读取。
框架形状有NoFrame、Box、Panel、StyledPanel、HLine和VLine;阴影样式有"平原"、“凸起"和"下沉”。
框架小部件有三个属性来描述边框的厚度:lineWidth、midLineWidth和frameWidth。
- 线宽是边框的宽度。可以对其进行修改以自定义框架的外观。
- 中间线宽度指定帧中间额外线的宽度,该宽度使用第三种颜色来获得特殊的3D效果。请注意,仅为凸起或凹陷的Box、HLine和VLine框架绘制中线。
- 框架宽度由框架样式决定,frameWidth()函数用于获得为所使用的样式定义的值。
可以使用setContentsMargins()函数自定义帧和帧内容之间的边距。
此表显示了样式和线宽的一些组合:
框架控件QFrame的属性
属性 | 描述 | 访问功能 |
---|---|---|
frameRect: PySide6.QtCore.QRect | 此属性保存框架的矩形。 框架的矩形是绘制框架的矩形。默认情况下,这是整个小部件。设置矩形不会导致小部件更新。当小部件改变大小时,框架矩形会自动调整。 如果将矩形设置为空矩形(例如,QRect(0,0,0)),则生成的框架矩形等效于小部件矩形。 | frameRect() setFrameRect(arg__1) |
frameShadow: Shadow | 此属性保存框架样式中的框架阴影值。 | frameShadow() setFrameShadow(arg__1) |
frameShape: Shape | 此属性保存框架样式中的框架形状值。 | frameShape() setFrameShape(arg__1) |
frameWidth: int | 此属性保留绘制的框架的宽度。。 请注意,边框宽度取决于边框样式,而不仅仅取决于线宽和中间线宽。例如,NoFrame指定的样式的边框宽度始终为0,而样式Panel的边框宽度等于线宽。 | frameWidth() |
lineWidth: int | 此属性保留线宽。 请注意,用作分隔符的帧(HLine和VLine)的总线宽由frameWidth指定。 默认值为1。 | lineWidth() setLineWidth(arg__1) |
midLineWidth: int | 此属性保持中线的宽度。 默认值为0。 | midLineWidth() setMidLineWidth(arg__1) |
框架控件QFrame的常用方法
框架控件QFrame是从QWidget类继承而来的用QFrame创建实例对象的常用方法如下所示,其中parent是窗口或者容器类控件,f用于设置控件的窗口类型可参考窗口flags的内容,默认值是QtWidget。
from PySide6.QtWidgets import QFrame
QFrame(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,
f: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))
QFrame的方法及参数类型 | 返回值的类型 | 说明 |
---|---|---|
setFrameShadow(QFrame.Shadow) | None | 设置QFrame窗口的阴影形式 |
frameShadow() | QFrame.Shadow | 获取窗口的阴影形式 |
setFrameShape(QFrame.Shape) | None | 设置QFrame窗口的边框形状 |
frameShape() | QFrame,Shape | 获取窗口的边框形状 |
setFrameStyle(int) | None | 设置边框的样式 |
frameStyle() | int | 获取边框的样式 |
setLineWidth(int) | None | 设置边框线的宽度 |
lineWidth() | int | 获取边框的宽度 |
setMidLineWidth(int) | None | 设置边框线的中间线的宽度 |
midLineWidth() | int | 获取边框线的中间线的宽度 |
frameWidth() | int | 获取边框的宽度 |
setFrameRect(QRect) | None | 设置边框线所在的范围 |
frameRect() | QRect | 获取边框线所在的范围 |
drawFrame(QPainter) | None | 绘制边框线 |
setLayout(QLayout) | None | 设置框架中的布局 |
setGeometry(QRect) | None | 设置QFrame控件左上角的位置和长 度、宽度 |
setGeometry(x:int,y: int,w; int,h; int) | ||
resize(QSize)、resize(w:int,h;int) | None | 设置QFrame控件的长度和宽度 |
-
框架主要由边框线构成,边框线由外线、内线和中间线构成。
- 外线和内线的宽度可以通过setLineWidth(int)方法设置,外线和内线的宽度通过 lineWidth()方法获取,
- 中间线宽度可以通过 setMidLineWidth(int)方法设置,中间线的宽度通过midLineWidth()方法获取,
- 外线内线和中间线宽度通过 frameWidth()方法获取
-
通过给边框的内线、外线设置不同的颜色,可以让外框有凸起和凹陷的立体感觉,用setFrameShadow(QFrame.Shadow)方法设置边框线的立体感觉,参数QFrame.Shadow可以取:
QFrame.Shadow 描述 QFrame.Shadow.Plain 平面 QFrame.Shadow.Raised 凸起 QFrame.Shadow.Sunken 凹陷 -
外框线的形状,通过 setFrameShape(QFrame.Shape)方法设置,其中参数QFrame.Shape是枚举类型可取值如表所示。
QFrame.Shape的取值 值 说明lacm QFrame.Shape.NoFrame 0 无边框,默认值 QFrame.Shape.Box 1 矩形框,边框线内部不填充 QFrame.Shape.Panel 2 面板,边框线内部填充 QFrame.Shape.WinPanel 3 Windows 2000风格的面板,边框线的宽度是2像素 QFrame.Shape.HLine 4 边框线只在中间有一条水平线(用作分隔线) QFrame.Shape.VLine 5 边框线只在中间有一条竖直线(用作分隔线) QFrame.Shape.StyledPanel 6 依据当前GUI类型,画一个矩形面板 - QFrame的frameStyle属性由frameShadow属性和frameShape属性决定,因此设置frameShadow和frameShape的值,就不需要再设置 frameStyle 的值了。将以上参数进行组合可以得到不同感觉的边框线。
-
在界面上,经常在不同类型的控件之间划分一条横线或竖线。横线和竖线可以用QFrame来创建,方法是设置setFrameShape(QFrame.HLine)或 setFrameShape(QFram.eVLine)并结合 setGeometry()或resize()方法确定线的位置和尺寸
QFreme样式图:
框架控件QFrame的应用实例
下面的程序将两组互斥的QRadioButton 分别放到两个 QFrame中,这两个QFrame又放到QGroupBox控件中。由于 QFrame 的边框线不可见,所以从外观上看,所有互斥的QRadioButton都放到了 QGroupBox控件中,但是选择时两组是可以分别选择的
import sys
from PySide6.QtWidgets import QApplication,QWidget,QGroupBox,QFrame,QRadioButton,QHBoxLayout,QRadioButton,QHBoxLayout
class MyWidget(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.setWindowTitle("QFrame 的应用")
self.resize(300,100)
self.setupUi()
def setupUi(self): # 创建界面上的控件
self.r_1=QRadioButton("男")
self.r_2=QRadioButton("女")
self.r_3=QRadioButton("党员")
self.r_4=QRadioButton("团员")
self.r_5=QRadioButton("群众")
self.frame_1=QFrame()
self.frame_2=QFrame()
self.h_layout_1=QHBoxLayout(self.frame_1)
self.h_layout_1.addWidget(self.r_1)
self.h_layout_1.addWidget(self.r_2)
self.h_layout_2=QHBoxLayout(self.frame_2)
self.h_layout_2.addWidget(self.r_3)
self.h_layout_2.addWidget(self.r_4)
self.h_layout_2.addWidget(self.r_5)
self.groupBox=QGroupBox("选择基本信息",self)
self.h_layout_3=QHBoxLayout(self.groupBox)
self.h_layout_3.addWidget(self.frame_1)
self.h_layout_3.addWidget(self.frame_2)
self.r_1.setChecked(True)
self.r_3.setChecked(True)
if __name__=='__main__':
app=QApplication(sys.argv)
win=MyWidget()
win.show()
sys.exit(app.exec())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5dnoGU6-1685888803748)(https://gitcode.net/qq_40597070/pic_go/raw/master/202303291946997.png)]
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/29 19:30
# File_name: 03-QFrame-例子.py
import sys
from PySide6.QtWidgets import QWidget,QVBoxLayout,QLabel,QFrame,QFormLayout,QComboBox,QSpinBox,QPushButton,QApplication
class FrameDemo(QWidget):
def __init__(self,parent=None):
super(FrameDemo,self).__init__(parent)
self.resize(350,500)
layout = QVBoxLayout()
self.label = QLabel("1.QLabel使用QFrame的效果")
self.label.setMaximumHeight(50)
self.label.setFrameStyle(QFrame.Shape.Panel | QFrame.Shadow.Raised)
self.label.setLineWidth(2)
layout.addWidget(self.label,stretch=0)
self.frame = QFrame()
label = QLabel('2.QFrame自身的效果',self.frame)
self.frame.setMinimumHeight(200)
layout.addWidget(self.frame)
formLayout = QFormLayout()
self.comboBoxShape = QComboBox()
self.comboBoxShape.addItems(['NoFrame','Box','Panel','StyledPanel','HLine','VLine','WinPanel'])
self.comboBoxShape.setCurrentText('Box')
self.comboBoxShape.currentIndexChanged.connect(self.updateFrame)
formLayout.addRow('框架样式:',self.comboBoxShape)
self.comboBoxShadow = QComboBox()
self.comboBoxShadow.addItems(['Plain','Raised','Sunken'])
self.comboBoxShadow.setCurrentText('Raised')
formLayout.addRow('阴影样式:',self.comboBoxShadow)
self.comboBoxShadow.currentIndexChanged.connect(self.updateFrame)
spinBoxLineWidth = QSpinBox()
spinBoxLineWidth.setMinimum(0)
spinBoxLineWidth.setValue(5)
spinBoxLineWidth.valueChanged.connect(lambda x: self.frame.setLineWidth(x))
formLayout.addRow('线宽:',spinBoxLineWidth)
spinBoxMidLineWidth = QSpinBox()
spinBoxMidLineWidth.setMinimum(0)
spinBoxMidLineWidth.setValue(3)
spinBoxMidLineWidth.valueChanged.connect(lambda x: self.frame.setMidLineWidth(x))
formLayout.addRow('中线宽:',spinBoxMidLineWidth)
labelFrameWidth = QLabel('frameWidth:xx')
buttonFrameWidth = QPushButton('获取frameWidth')
formLayout.addRow(labelFrameWidth,buttonFrameWidth)
buttonFrameWidth.clicked.connect(lambda: labelFrameWidth.setText('frameWidth:%s'% self.frame.frameWidth()))
layout.addLayout(formLayout)
self.updateFrame()
self.frame.setLineWidth(spinBoxLineWidth.value())
self.frame.setMidLineWidth(spinBoxMidLineWidth.value())
self.setLayout(layout)
self.setWindowTitle("QFrame 例子")
def updateFrame(self):
shape = getattr(QFrame.Shape,self.comboBoxShape.currentText())
shadow = getattr(QFrame.Shadow,self.comboBoxShadow.currentText())
self.frame.setFrameStyle(shape | shadow)
self.label.setFrameStyle(shape | shadow)
if __name__ =='__main__':
app = QApplication(sys.argv)
win = FrameDemo()
win.show()
sys.exit(app.exec())