基本Widgets(22):【类】QFrame[官翻]

QFrame Class

QFrame类是可以具有框架的小部件的基类。

Header#include < QFrame >
qmakeQT += widgets
InheritsQWidget
Inherited ByQAbstractScrollArea, QLabel, QLCDNumber, QSplitter, QStackedWidget, and QToolBox

详细说明

QMenu使用此框架将菜单“提升”到周围屏幕的上方。QProgressBar有“凹陷”的外观。QLabel的外观是扁平的。这些小部件的框架可以更改。

QFrame类还可以直接用于创建没有任何内容的简单占位符框架。

框架样式由框架形状和阴影样式指定,阴影样式用于从视觉上将框架与周围的小部件分开。这些属性可以使用setFrameStyle() 函数一起设置,并使用frameStyle() 读取。

框架形状有NoFrame、Box、Panel、StyledPanel、HLine和VLine;阴影样式有素色、凸起和凹陷。

frame小部件有三个描述边框厚度的属性:lineWidth、midLineWidth和frameWidth。

  • lineWidth 是边框的宽度。可以对其进行修改以自定义框架的外观。
  • midLineWidth 指定帧中间一条额外线的宽度,该线使用第三种颜色来获得特殊的3D效果。请注意,仅为凸起或凹陷的框、线和线框绘制中线。
  • frameWidth 由框架样式决定,frameWidth() 函数用于获取为所用样式定义的值。

可以使用QWidget::setContentsMargins() 函数自定义框架和框架内容之间的边距

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

公共属性

enum Shadow

此枚举类型定义用于为帧提供3D效果的阴影类型。

ConstantValueDescription
Plain0x0010框架和内容与周围环境保持一致;使用调色板QPalette::WindowText颜色绘制(没有任何3D效果)
Raised0x0020框架和内容显示为凸起;使用当前颜色组的浅色和深色绘制三维凸起线
Sunken0x0030框架和内容显示为凹陷;使用当前颜色组的浅色和深色绘制三维凹陷线

Shadow与QFrame::Shape、lineWidth() 和midLineWidth() 交互。请参见主类文档中的框架图片。

enum Shape

此枚举类型定义可用框架的形状。

ConstantValueDescription
NoFrame0QFrame不绘制任何内容
Box0x0001QFrame在其内容周围绘制一个框
Panel0x0002QFrame绘制一个面板,使内容看起来凸起或凹陷
WinPanel0x0003绘制一个矩形面板,该面板可以像Windows2000中的面板那样凸起或凹陷。指定此形状会将线宽设置为2像素。提供WinPanel是为了兼容性。对于GUI风格的独立性,我们建议改用StyledPanel。
HLine0x0004QFrame画一条没有边框的水平线(用作分隔符)
VLine0x0005QFrame绘制一条没有边框的垂直线(用作分隔符)
StyledPanel0x0006绘制一个矩形面板,其外观取决于当前的GUI样式。它可以上升或下沉。

enum StyleMask

此枚举定义了两个常量,可用于提取frameStyle() 的两个组件:

ConstantValueDescription
Shadow_Mask0x00f0frameStyle() 的阴影部分
Shape_Mask0x000fframeStyle() 的形状部分

通常,您不需要使用这些,因为frameShadow() 和frameShape() 已经提取了frameStyle() 的阴影和形状部分。

属性

  1. frameRect: QRect 框架的矩形
    框架的矩形就是框架所绘制的矩形。默认情况下,这是整个小部件。设置矩形不会导致小部件更新。当小部件改变大小时,框架矩形会自动调整。
    如果将矩形设置为空矩形(例如,QRect(0,0,0,0)),则生成的框架矩形与小部件矩形等效。

    Access functions:

    • QRect frameRect() const
    1. void setFrameRect(const QRect &)
  2. frameShadow: Shadow 框架样式中的阴影值

    Access functions:

    • QFrame::Shadow frameShadow() const
    1. void setFrameShadow(QFrame::Shadow)
  3. frameShape: Shape 框架形状值

    Access functions:

    • QFrame::Shape frameShape() const
    1. void setFrameShape(QFrame::Shape)
  4. frameWidth: const int 绘制的框架的宽度
    请注意,边框宽度取决于边框样式,而不仅仅是线条宽度和中间线条宽度。例如,NoFrame指定的样式的边框宽度始终为0,而样式面板的边框宽度等于线宽。

    Access functions:

    • int frameWidth() const
  5. lineWidth: int 线宽
    请注意,用作分隔符的帧(HLine和VLine)的总线宽由frameWidth指定。
    默认值为1。

    Access functions:

    • int lineWidth() const
    1. void setLineWidth(int)
  6. midLineWidth: int 中线的宽度
    默认值为0。

    Access functions:

    • int midLineWidth() const
    1. void setMidLineWidth(int)

公共函数

构造和析构

  1. QFrame(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
  2. virtual ~QFrame()

属性相关

  1. QRect frameRect() const
  2. void setFrameRect(const QRect &)
  3. QFrame::Shadow frameShadow() const
  4. void setFrameShadow(QFrame::Shadow)
  5. QFrame::Shape frameShape() const
  6. void setFrameShape(QFrame::Shape)
  7. int frameWidth() const
  8. int lineWidth() const
  9. void setLineWidth(int)
  10. int midLineWidth() const
  11. void setMidLineWidth(int)

特殊

  1. int frameStyle() const 返回框架样式
    默认值为QFrame::Plain。
  2. void setFrameStyle(int style) 将框架样式设置为“style”
    样式是框架形状和框架阴影的按位或运算。请参见主类文档中的框架图片。
    框架形状在QFrame::Shape中给出,阴影样式在QFrame::shadow中给出。
    如果指定的中线宽度大于0,则会为凸起或凹陷的框、线和线框绘制一条附加线。当前颜色组的中间色用于绘制中间线。

重写的公共函数

  1. virtual QSize sizeHint() const override

受保护的函数

  1. void initStyleOption(QStyleOptionFrame *option) const

重写的受保护的函数

  1. virtual void changeEvent(QEvent *ev) override
  2. virtual bool event(QEvent *e) override
  3. virtual void paintEvent(QPaintEvent *) override

小案例

// 程序没啥意思,就是想要实现官档示例图片中的界面。发现不同的样式,会有不同的效果,鄙视ing。。。
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication::setStyle(QStyleFactory::create ("windows"));  // fusion  windowsvista   windows
    QApplication app(argc,argv);
    app.setApplicationName ("QFrame-windows");

    QWidget w;

    QGridLayout *mainLayout  = new QGridLayout(&w);

    int i = 0;

    for (int j = 0; j < 4; ++j) {
        QLabel * temp = new QLabel(QString::number (j+1));
        temp->setSizePolicy (QSizePolicy::Expanding,QSizePolicy::Expanding);
        temp->setAlignment (Qt::AlignCenter);
        temp->setStyleSheet ("background: white;");
        mainLayout->addWidget (temp,i,j*4,1,4);
    }
    QLabel * label = new QLabel("lineWidth()");
    label->setStyleSheet ("color:blue");
    label->setMinimumHeight (24);
    mainLayout->addWidget (label,i,16);

    ++i;

    for (int j = 0; j < 16; ++j) {
        QLabel * temp = new QLabel(QString::number (j%4));
        temp->setAlignment (Qt::AlignCenter);
        temp->setStyleSheet ("background: white;");
        mainLayout->addWidget (temp,i,j,1,1);
    }
    label = new QLabel("midLineWidth()");
    label->setStyleSheet ("color:blue");
    label->setMinimumHeight (24);
    mainLayout->addWidget (label,i,16);
    ++i;

    QString Shape[] = {"Box","Panel","WinPanel","HLine","VLine","StyledPanel"};
    QString Shadow[] = {"Plain","Raised","Sunken"};
    int shape =0,shadow=0;
    for (int line = 0; line < 18; ++line) {
        shape = line / 3;
        shadow %= 3;
        for (int j = 0; j < 16; ++j) {
            QFrame *frame = new QFrame;
            frame->setMinimumSize (24,24);
            frame->setLineWidth (j/4+1);
            frame->setMidLineWidth (j%4);
            frame->setFrameShape ((QFrame::Shape)(shape+1));
            frame->setFrameShadow ((QFrame::Shadow)((shadow+1)*16));
            mainLayout->addWidget (frame,i+line,j,1,1);
        }
        label = new QLabel(Shape[shape]+","+Shadow[shadow]);
        mainLayout->addWidget (label,i+line,16);
        shadow++;
        if(shadow % 3 == 0) {
            i++;
            mainLayout->addItem (new QSpacerItem(10,10),i+line,0);
        }
    }

    w.show ();
    app.exec();
    return 0;
}

总结

QFrame这个类基本当作一个容器使用吧,因为QWidget支持QSS样式表,可以自定义边框,比QFrame更方便,样式也更多。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值