24-容器和容器控件-QFrame

容器类控件不能输人输出数据,通常作为常用控件的载体,将常用控件"放置"到其内部。

容器控件对放到其内部的控件进行管理,并成为控件的父控件。

常用的容器控件如表所示:

容器控件类中文名
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()函数自定义帧和帧内容之间的边距。

此表显示了样式和线宽的一些组合:

帧.png

框架控件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.NoFrame0无边框,默认值
    QFrame.Shape.Box1矩形框,边框线内部不填充
    QFrame.Shape.Panel2面板,边框线内部填充
    QFrame.Shape.WinPanel3Windows 2000风格的面板,边框线的宽度是2像素
    QFrame.Shape.HLine4边框线只在中间有一条水平线(用作分隔线)
    QFrame.Shape.VLine5边框线只在中间有一条竖直线(用作分隔线)
    QFrame.Shape.StyledPanel6依据当前GUI类型,画一个矩形面板
    • QFrame的frameStyle属性由frameShadow属性和frameShape属性决定,因此设置frameShadow和frameShape的值,就不需要再设置 frameStyle 的值了。将以上参数进行组合可以得到不同感觉的边框线。
  • 在界面上,经常在不同类型的控件之间划分一条横线或竖线。横线和竖线可以用QFrame来创建,方法是设置setFrameShape(QFrame.HLine)或 setFrameShape(QFram.eVLine)并结合 setGeometry()或resize()方法确定线的位置和尺寸

QFreme样式图:

帧.png

框架控件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())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QFrame 是一个基础的 Qt 控件,它可以作为一个容器来包含其他的控件。动态添加控件并布局可以通过以下步骤实现: 1. 创建 QFrame 控件。 2. 创建要添加的控件,例如 QPushButton、QLabel 等。 3. 将要添加的控件添加到 QFrame 中,可以使用 addWidget() 方法。 4. 设置 QFrame 的布局方式,例如 QVBoxLayout、QGridLayout 等。 5. 将 QFrame 添加到父控件中,例如 QMainWindow、QWidget 等。 下面是一个示例代码,演示了如何在 QFrame 中动态添加 QPushButton 并使用 QVBoxLayout 布局: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout, QFrame class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QFrame 控件 self.frame = QFrame(self) # 创建 QPushButton 控件 self.button1 = QPushButton('Button 1', self) self.button2 = QPushButton('Button 2', self) # 将 QPushButton 控件添加到 QFrame 中 layout = QVBoxLayout(self.frame) layout.addWidget(self.button1) layout.addWidget(self.button2) # 设置 QFrame 的布局方式 self.frame.setLayout(layout) # 将 QFrame 添加到 QMainWindow 中 self.setCentralWidget(self.frame) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上述代码中,我们创建了一个 QFrame 控件,然后创建了两个 QPushButton 控件,并将它们添加到 QFrame 中。接着,我们使用 QVBoxLayout 布局将这两个按钮垂直排列。最后,我们将 QFrame 添加到 QMainWindow 中,并显示窗口。运行程序后,我们可以看到两个按钮被垂直排列在 QFrame 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值