QT sizeHint 及 Policy的用法

https://www.pianshen.com/article/8597214460/

Qt 中的 sizeHint 属性,sizeHint() 如何使用?

Qt 中的 minimumSizeHint 属性,minimumSizeHint() 如何使用?

Qt 中的 sizePolicy 属性,setSizePolicy()、sizePolicy()如何使用?

sizeHint 

这个属性所保存的 QSize 类型的值是一个被推荐给窗口或其它组件(为了方便下面统称为widget)的尺寸,也就是说一个 widget 该有多大,它的一个参考来源就是这个 sizeHint 属性的值,而这个值由 sizeHint() 函数来确定。

但是 widget 的大小的确定还有其它因素作用,下面会讲到。现在只需知道 sizeHint() 会返回一个被推荐的尺寸。

那么这个尺寸的取值是怎样的呢?

当它是一个无效值的时候,这种情况多半是widget 没有布局(layout),(sizeHint().isValid() 返回 false,QSize 中 width 或者 height 有一个为负数就会是无效的)

当它是一个有效值的时候,这种情况就是有布局,它就成了 widget 大小的一个参考。

QWidget *widget =newQWidget;

widget->show();

qDebug() << widget->width() <<","<< widget->height();

qDebug() << widget->sizeHint().width() <<","<< widget->sizeHint().height();

运行结果:

1009,520

-1, –1

输出结果中第二行:sizeHint() 返回的是一个无效的 QSize,因为 widget 没有布局。

QWidget *widget =newQWidget;

QHBoxLayout *layout =newQHBoxLayout;

QPushButton *button =newQPushButton("百度");

layout->addWidget(button);

widget->setLayout(layout);

widget->show();

qDebug() << widget->width() <<","<< widget->height();

qDebug() << widget->sizeHint().width() <<","<< widget->sizeHint().height();

qDebug() << button->width() <<","<< button->height();

运行结果:

112,45

97,45

90,23

输出结果中第一行:widget 的实际尺寸 (112, 45);

输出结果中第二行:sizeHint() 返回 layout 的首选尺寸(97,45)供 widget 参考;

输出结果中第三行:中间 button 的实际大小;

从输出结果中可以证明以上说过的两点:

1) 在 widget 有 layout 的情况下,其 sizeHint() 函数返回的是有效值作为其自身实际尺寸的参考;

2) sizeHint() 返回的值并不一定会作为 widget 的实际尺寸,因为 widget 的尺寸的决定还有其它因素作用;

minimumSizeHint 

Qt 中的 widget 有 size 和 minimumSize 两个属性,比较好理解的是上面的 sizeHint 是作为 size 的参考的,那么 minimumSizeHint 是作为 minimumSize 的参考的。minimumSizeHint() 的默认实现同 sizeHint() 基本一样:

在 widget 无 layout 的情况下返回无效值

否则返回 layout 的最小尺寸(minimum size)

注意与上面的首选尺寸不同哦!

有同学会问 preferred size 和 minimum size 的区别:preferred size 由 layout 的 sizeHint() 函数返回,minimum size 由 layout 的 minimumSize() 函数返回;前者的实现会根据 layout 的种类的变化而变化,比如在 QHBoxLayout 和 QVBoxLayout 中各放置同样的两个 QPushButton,两者的 sizeHint() 返回的值是不一样的,后者是返回能够容纳下所有包含在 layout 内的组件的最小尺寸。Qt 中大多数内置的 widget 都已经重新实现了 minimumSizeHint()。你可以自己写自己的 widget 然后重新实现 sizeHint()、minimumSizeHint() 这些函数来达到自己的布局效果。

QWidget *widget =newQWidget;

widget->setMinimumSize(10,10);

QVBoxLayout *layout =newQVBoxLayout;

QPushButton *button =newQPushButton("百度");

layout->addWidget(button);

widget->setLayout(layout);

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 

这个属性保存了该 widget 的默认布局属性,如果它有一个 layout 来布局其子 widgets,那么这个 layout 的 size policy 将被使用;如果该 widget 没有 layout 来布局其子 widgets,那么它的 size policy 将被使用。默认的 policy 是 Preferred/Preferred。

从上图中可以看出 Preferred 虽然可以收缩得比 sizeHint() 更小,但是最小由 minimumSizeHint() 限制

QWidget *widget =newQWidget;

QHBoxLayout *layout =newQHBoxLayout;

QPushButton *button =newQPushButton("Ggicci");

//button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

layout->addWidget(button);

widget->setLayout(layout);

widget->show();

在第4行代码注释掉的情况下:QPushButton 默认的 sizePolicy 是垂直方向 Fixed,水平方向 Preferred,故水平方向会伸展

QSizePolicy::Preferred 和 QSizePolicy::Expanding 的区别:两者都可以伸展和收缩,但是区别在于谁可以伸展地更牛B

QWidget *widget =newQWidget;

QHBoxLayout *layout =newQHBoxLayout;

QPushButton *button1 =newQPushButton("Ggicci");

QPushButton *button2 =newQPushButton("Mingjie Tang");

button1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

button2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

layout->addWidget(button1);

layout->addWidget(button2);

widget->setLayout(layout);

widget->show();

两者一样牛B(在水平方向上,垂直方向不构成额外空间竞争关系):

QWidget *widget =newQWidget;

QHBoxLayout *layout =newQHBoxLayout;

QPushButton *button1 =newQPushButton("Ggicci");

QPushButton *button2 =newQPushButton("Mingjie Tang");

button1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

layout->addWidget(button1);

layout->addWidget(button2);

widget->setLayout(layout);

widget->show();

button2更牛B(在水平方向上构成竞争关系)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352