Qt中的 Size Hints 和 Size Policies.docx
- 文档编号:6498393
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:6
- 大小:136.89KB
Qt中的 Size Hints 和 Size Policies.docx
《Qt中的 Size Hints 和 Size Policies.docx》由会员分享,可在线阅读,更多相关《Qt中的 Size Hints 和 Size Policies.docx(6页珍藏版)》请在冰豆网上搜索。
Qt中的SizeHints和SizePolicies
Qt中的SizeHints和SizePolicies
之前一直对这几个属性搞不清楚,前几天仔仔细细地看了文档解释并做了一些测试,现在来归纳一下:
首先我们得知道这几个属性保存的值是什么,它们分别是用来干什么的。
∙ sizeHint
∙这个属性所保存的QSize类型的值是一个被推荐给窗口或其它组件(为了方便下面统称为widget)的尺寸,也就是说一个widget该有多大,它的一个参考来源就是这个sizeHint属性的值,而这个值由sizeHint()函数来确定。
但是widget的大小的确定还有其它因素作用,下面会讲到。
现在只需知道sizeHint()会返回一个被推荐的尺寸。
那么这个尺寸的取值是怎样的呢?
当它是一个无效值的时候(sizeHint().isValid()返回false,QSize中width或者height有一个为复数就会是无效的),什么作用也没有;当它是一个有效值的时候,它就成了widget大小的一个参考。
Qt中对sizeHint()的默认实现是这样的:
当widget没有布局(layout),返回无效值;否则返回其layout的首选尺寸( preferredsize)。
1:
QWidget*widget=newQWidget;
2:
widget->show();
3:
qDebug()<
4:
qDebug()<
1:
//output:
2:
//1009,520
3:
//-1,–1
输出结果中第二行:
sizeHint()返回的是一个无效的QSize,因为widget没有布局。
1:
QWidget*widget=newQWidget;
2:
QHBoxLayout*layout=newQHBoxLayout;
3:
QPushButton*button=newQPushButton("Ggicci");
4:
layout->addWidget(button);
5:
widget->setLayout(layout);
6:
widget->show();
7:
qDebug()<
8:
qDebug()<
9:
qDebug()<
1:
//output:
2:
//112,45
3:
//97,45
4:
//90,23
输出结果中第一行:
widget的实际尺寸(112,45);
输出结果中第二行:
sizeHint()返回layout的首选尺寸(97,45)供widget参考;
输出结果中第三行:
中间button的实际大小;
从输出结果中可以证明以上说过的两点:
1)在widget有layout的情况下,其sizeHint()函数返回的是有效值作为其自身实际尺寸的参考;
2)sizeHint()返回的值并不一定会作为widget的实际尺寸,因为widget的尺寸的决定还有其它因素作用;
∙ minimumSizeHint
∙[ FromQtDoc :
Qt中的widget有size和minimumSize两个属性,比较好理解的是上面的sizeHint是作为size的参考的,那么minimumSizeHint是作为minimumSize的参考的。
minimumSizeHint()的默认实现同sizeHint()基本一样:
在widget无layout的情况下返回无效值;否则返回layout的最小尺寸( minimumsize ),注意与上面的首选尺寸不同哦!
有同学会问preferredsize和minimumsize的区别:
preferredsize由layout的sizeHint()函数返回,minimumsize由layout的minimumSize()函数返回;前者的实现会根据layout的种类的变化而变化,比如在QHBoxLayout和QVBoxLayout中各放置同样的两个QPushButton,两者的sizeHint()返回的值是不一样的,后者是返回能够容纳下所有包含在layout内的组件的最小尺寸。
Qt中大多数内置的widget都已经重新实现了minimumSizeHint()。
你可以自己写自己的widget然后重新实现sizeHint()、minimumSizeHint()这些函数来达到自己的布局效果。
∙[ FromQtDoc :
layout永远也不会把一个widget的大小设置到比minimumSizeHint()返回的尺寸还小,除非widget设置了最小尺寸或者其sizePolicy属性设置了QSizePolicy:
:
Ignore。
如果widget通过setMinimumSize()设置了最小尺寸,那么minimumSizeHint的作用就会被忽略掉。
我们知道如果在一个layout里面添加一些子widget,然后窗口应用这个layout的时候,一般情况下我们是无法缩放到使其中的子widget看不见的。
如下:
1:
QWidget*widget=newQWidget;
2:
widget->setMinimumSize(10,10);
3:
QVBoxLayout*layout=newQVBoxLayout;
4:
QPushButton*button=newQPushButton("Ggicci");
5:
layout->addWidget(button);
6:
widget->setLayout(layout);
7:
widget->show();
这里同上显示一个含有QPushButton的QWidget,不过在这里设置了其最小尺寸为(10,10),此时minimumSizeHint()将不起作用,也就是我们可以把widget缩放到(10,10),不过这是理论上的哦,亲~(在这里你讲看到一个例外),以下就是缩小到了极致:
(112,10),同学,是否在思考为什么width无法缩小到比 112更小了。
其实这是widget和windows系统的共同问题,第一widget默认有min,max,close三个按钮,也就是右上角的最小化、最大化、关闭按钮,这导致了width无法继续缩小。
其实通过widget->setWindowFlags(Qt:
:
Window|Qt:
:
WindowTitleHint);可以把min,max按钮给去了,这样的widget的width就可以比之前更小一点啦,如下右图。
∙ sizePolicy
∙[ FromQtDoc :
这个属性保存了该widget的默认布局属性,如果它有一个layout来布局其子widgets,那么这个layout的sizepolicy将被使用;如果该widget没有layout来布局其子widgets,那么它的sizepolicy将被使用。
默认的policy是Preferred/Preferred。
QSizePolicy:
:
Policy枚举值有如下几个:
Constants
Description
QSizePolicy:
:
Fixed
widget的实际尺寸只参考sizeHint()的返回值,不能伸展(grow)和收缩(shrink)
QSizePolicy:
:
Minimum
可以伸展和收缩,不过sizeHint()的返回值规定了widget能缩小到的最小尺寸
QSizePolicy:
:
Maximum
可以伸展和收缩,不过sizeHint()的返回值规定了widget能伸展到的最大尺寸
QSizePolicy:
:
Preferred
可以伸展和收缩,但没有优势去获取更大的额外空间使自己的尺寸比sizeHint()的返回值更大
QSizePolicy:
:
Expanding
可以伸展和收缩,它会尽可能多地去获取额外的空间,也就是比Preferred更具优势
QSizePolicy:
:
MinimumExpanding
可以伸展和收缩,不过sizeHint()的返回值规定了widget能缩小到的最小尺寸,同时它比Preferred更具优势去获取额外空间
QSizePolicy:
:
Ignored
忽略sizeHint()的作用
从上图中可以看出Preferred虽然可以收缩得比sizeHint()更小,但是最小由minimumSizeHint()限制
∙QSizePolicy:
:
Fixed
1:
QWidget*widget=newQWidget;
2:
QHBoxLayout*layout=newQHBoxLayout;
3:
QPushButton*button=newQPushButton("Ggicci");
4:
//button->setSizePolicy(QSizePolicy:
:
Fixed,QSizePolicy:
:
Fixed);
5:
layout->addWidget(button);
6:
widget->setLayout(layout);
7:
widget->show();
在第4行代码注释掉的情况下:
QPushButton默认的sizePolicy是垂直方向Fixed,水平方向Preferred,故水平方向会伸展
没有注释掉的情况下:
∙QSizePolicy:
:
Preferred和QSizePolicy:
:
Expanding的区别 :
两者都可以伸展和收缩,但是区别在于谁可以伸展地更牛B
1:
QWidget*widget=newQWidget;
2:
QHBoxLayout*layout=newQHBoxLayout;
3:
QPushButton*button1=newQPushButton("Ggicci");
4:
QPushButton*button2=newQPushButton("MingjieTang");
5:
button1->setSizePolicy(QSizePolicy:
:
Preferred,QSizePolicy:
:
Preferred);
6:
button2->setSizePolicy(QSizePolicy:
:
Preferred,QSizePolicy:
:
Preferred);
7:
layout->addWidget(button1);
8:
layout->addWidget(button2);
9:
widget->setLayout(layout);
10:
widget->show();
两者一样牛B(在水平方向上,垂直方向不构成额外空间竞争关系):
1:
QWidget*widget=newQWidget;
2:
QHBoxLayout*layout=newQHBoxLayout;
3:
QPushButton*button1=newQPushButton("Ggicci");
4:
QPushButton*button2=newQPushButton("MingjieTang");
5:
button1->setSizePolicy(QSizePolicy:
:
Preferred,QSizePolicy:
:
Preferred);
6:
button2->setSizePolicy(QSizePolicy:
:
Expanding,QSizePolicy:
:
Preferred);
7:
layout->addWidget(button1);
8:
layout->addWidget(button2);
9:
widget->setLayout(layout);
10:
widget->show();
button2更牛B(在水平方向上构成竞争关系):
∙有了上述的样例,QSizePolicy:
:
Minimum,QSizePolicy:
:
Maximum,QSizePolicy:
:
MinimumExpanding,QSizePolicy:
:
Ignored就比较好理解了吧,亲
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt中的 Size Hints Policies Qt 中的