QFrame Class
QFrame类是可以具有框架的小部件的基类。
Header | #include < QFrame > |
---|---|
qmake | QT += widgets |
Inherits | QWidget |
Inherited By | QAbstractScrollArea, 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() 函数自定义框架和框架内容之间的边距。
此表显示了一些样式和线宽的组合:
公共属性
enum Shadow
此枚举类型定义用于为帧提供3D效果的阴影类型。
Constant | Value | Description |
---|---|---|
Plain | 0x0010 | 框架和内容与周围环境保持一致;使用调色板QPalette::WindowText颜色绘制(没有任何3D效果) |
Raised | 0x0020 | 框架和内容显示为凸起;使用当前颜色组的浅色和深色绘制三维凸起线 |
Sunken | 0x0030 | 框架和内容显示为凹陷;使用当前颜色组的浅色和深色绘制三维凹陷线 |
Shadow与QFrame::Shape、lineWidth() 和midLineWidth() 交互。请参见主类文档中的框架图片。
enum Shape
此枚举类型定义可用框架的形状。
Constant | Value | Description |
---|---|---|
NoFrame | 0 | QFrame不绘制任何内容 |
Box | 0x0001 | QFrame在其内容周围绘制一个框 |
Panel | 0x0002 | QFrame绘制一个面板,使内容看起来凸起或凹陷 |
WinPanel | 0x0003 | 绘制一个矩形面板,该面板可以像Windows2000中的面板那样凸起或凹陷。指定此形状会将线宽设置为2像素。提供WinPanel是为了兼容性。对于GUI风格的独立性,我们建议改用StyledPanel。 |
HLine | 0x0004 | QFrame画一条没有边框的水平线(用作分隔符) |
VLine | 0x0005 | QFrame绘制一条没有边框的垂直线(用作分隔符) |
StyledPanel | 0x0006 | 绘制一个矩形面板,其外观取决于当前的GUI样式。它可以上升或下沉。 |
enum StyleMask
此枚举定义了两个常量,可用于提取frameStyle() 的两个组件:
Constant | Value | Description |
---|---|---|
Shadow_Mask | 0x00f0 | frameStyle() 的阴影部分 |
Shape_Mask | 0x000f | frameStyle() 的形状部分 |
通常,您不需要使用这些,因为frameShadow() 和frameShape() 已经提取了frameStyle() 的阴影和形状部分。
属性
-
frameRect: QRect 框架的矩形
框架的矩形就是框架所绘制的矩形。默认情况下,这是整个小部件。设置矩形不会导致小部件更新。当小部件改变大小时,框架矩形会自动调整。
如果将矩形设置为空矩形(例如,QRect(0,0,0,0)),则生成的框架矩形与小部件矩形等效。Access functions:
- QRect frameRect() const
- void setFrameRect(const QRect &)
-
frameShadow: Shadow 框架样式中的阴影值
Access functions:
- QFrame::Shadow frameShadow() const
- void setFrameShadow(QFrame::Shadow)
-
frameShape: Shape 框架形状值
Access functions:
- QFrame::Shape frameShape() const
- void setFrameShape(QFrame::Shape)
-
frameWidth: const int 绘制的框架的宽度
请注意,边框宽度取决于边框样式,而不仅仅是线条宽度和中间线条宽度。例如,NoFrame指定的样式的边框宽度始终为0,而样式面板的边框宽度等于线宽。Access functions:
- int frameWidth() const
-
lineWidth: int 线宽
请注意,用作分隔符的帧(HLine和VLine)的总线宽由frameWidth指定。
默认值为1。Access functions:
- int lineWidth() const
- void setLineWidth(int)
-
midLineWidth: int 中线的宽度
默认值为0。Access functions:
- int midLineWidth() const
- void setMidLineWidth(int)
公共函数
构造和析构
- QFrame(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
- virtual ~QFrame()
属性相关
- QRect frameRect() const
- void setFrameRect(const QRect &)
- QFrame::Shadow frameShadow() const
- void setFrameShadow(QFrame::Shadow)
- QFrame::Shape frameShape() const
- void setFrameShape(QFrame::Shape)
- int frameWidth() const
- int lineWidth() const
- void setLineWidth(int)
- int midLineWidth() const
- void setMidLineWidth(int)
特殊
- int frameStyle() const 返回框架样式
默认值为QFrame::Plain。 - void setFrameStyle(int style) 将框架样式设置为“style”
样式是框架形状和框架阴影的按位或运算。请参见主类文档中的框架图片。
框架形状在QFrame::Shape中给出,阴影样式在QFrame::shadow中给出。
如果指定的中线宽度大于0,则会为凸起或凹陷的框、线和线框绘制一条附加线。当前颜色组的中间色用于绘制中间线。
重写的公共函数
- virtual QSize sizeHint() const override
受保护的函数
- void initStyleOption(QStyleOptionFrame *option) const
重写的受保护的函数
- virtual void changeEvent(QEvent *ev) override
- virtual bool event(QEvent *e) override
- virtual void paintEvent(QPaintEvent *) override
小案例
![](https://gitee.com/shenjiguicang/test/raw/master/images/20210125163156.png)
// 程序没啥意思,就是想要实现官档示例图片中的界面。发现不同的样式,会有不同的效果,鄙视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更方便,样式也更多。