https://www.pianshen.com/article/8597214460/
Qt 中的 sizeHint 屬性舔痪,sizeHint() 如何使用噪沙?
Qt 中的 minimumSizeHint 屬性,minimumSizeHint() 如何使用?
Qt 中的 sizePolicy 屬性,setSizePolicy()、sizePolicy()如何使用厢漩?
sizeHint?
這個(gè)屬性所保存的 QSize 類型的值是一個(gè)被推薦給窗口或其它組件(為了方便下面統(tǒng)稱為widget)的尺寸,也就是說一個(gè) widget 該有多大岩臣,它的一個(gè)參考來源就是這個(gè) sizeHint 屬性的值溜嗜,而這個(gè)值由 sizeHint() 函數(shù)來確定。
但是 widget 的大小的確定還有其它因素作用架谎,下面會(huì)講到×皇ぃ現(xiàn)在只需知道 sizeHint() 會(huì)返回一個(gè)被推薦的尺寸。
那么這個(gè)尺寸的取值是怎樣的呢狐树?
當(dāng)它是一個(gè)無效值的時(shí)候焙压,這種情況多半是widget 沒有布局(layout),(sizeHint().isValid() 返回 false抑钟,QSize 中 width 或者 height 有一個(gè)為負(fù)數(shù)就會(huì)是無效的)
當(dāng)它是一個(gè)有效值的時(shí)候涯曲,這種情況就是有布局,它就成了 widget 大小的一個(gè)參考在塔。
QWidget *widget =newQWidget;
widget->show();
qDebug() << widget->width() <<","<< widget->height();
qDebug() << widget->sizeHint().width() <<","<< widget->sizeHint().height();
運(yùn)行結(jié)果:
1009,520
-1, –1
輸出結(jié)果中第二行:sizeHint() 返回的是一個(gè)無效的 QSize幻件,因?yàn)?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();
運(yùn)行結(jié)果:
112,45
97,45
90,23
輸出結(jié)果中第一行:widget 的實(shí)際尺寸 (112蛔溃, 45)绰沥;
輸出結(jié)果中第二行:sizeHint() 返回 layout 的首選尺寸(97,45)供 widget 參考贺待;
輸出結(jié)果中第三行:中間 button 的實(shí)際大谢涨;
從輸出結(jié)果中可以證明以上說過的兩點(diǎn):
1) 在 widget 有 layout 的情況下麸塞,其 sizeHint() 函數(shù)返回的是有效值作為其自身實(shí)際尺寸的參考秃臣;
2) sizeHint() 返回的值并不一定會(huì)作為 widget 的實(shí)際尺寸,因?yàn)?widget 的尺寸的決定還有其它因素作用;
minimumSizeHint?
Qt 中的 widget 有 size 和 minimumSize 兩個(gè)屬性奥此,比較好理解的是上面的 sizeHint 是作為 size 的參考的弧哎,那么 minimumSizeHint 是作為 minimumSize 的參考的。minimumSizeHint() 的默認(rèn)實(shí)現(xiàn)同 sizeHint() 基本一樣:
在 widget 無 layout 的情況下返回?zé)o效值
否則返回 layout 的最小尺寸(minimum size)
注意與上面的首選尺寸不同哦稚虎!
有同學(xué)會(huì)問 preferred size 和 minimum size 的區(qū)別:preferred size 由 layout 的 sizeHint() 函數(shù)返回撤嫩,minimum size 由 layout 的 minimumSize() 函數(shù)返回;前者的實(shí)現(xiàn)會(huì)根據(jù) layout 的種類的變化而變化蠢终,比如在 QHBoxLayout 和 QVBoxLayout 中各放置同樣的兩個(gè) QPushButton序攘,兩者的 sizeHint() 返回的值是不一樣的,后者是返回能夠容納下所有包含在 layout 內(nèi)的組件的最小尺寸蜕径。Qt 中大多數(shù)內(nèi)置的 widget 都已經(jīng)重新實(shí)現(xiàn)了 minimumSizeHint()两踏。你可以自己寫自己的 widget 然后重新實(shí)現(xiàn) sizeHint()、minimumSizeHint() 這些函數(shù)來達(dá)到自己的布局效果兜喻。
QWidget *widget =newQWidget;
widget->setMinimumSize(10,10);
QVBoxLayout *layout =newQVBoxLayout;
QPushButton *button =newQPushButton("百度");
layout->addWidget(button);
widget->setLayout(layout);
widget->show();
這里同上顯示一個(gè)含有 QPushButton 的 QWidget梦染,不過在這里設(shè)置了其最小尺寸為(10, 10)朴皆,此時(shí) minimumSizeHint() 將不起作用帕识,也就是我們可以把 widget 縮放到(10, 10)遂铡,不過這是理論上的哦肮疗,親~(在這里你講看到一個(gè)例外),以下就是縮小到了極致:(112扒接,10)伪货,同學(xué),是否在思考為什么 width 無法縮小到比? 112 更小了钾怔。
其實(shí)這是 widget 和 windows 系統(tǒng)的共同問題碱呼,第一 widget 默認(rèn)有 min,max,close 三個(gè)按鈕,也就是右上角的最小化宗侦、最大化愚臀、關(guān)閉按鈕,這導(dǎo)致了 width 無法繼續(xù)縮小矾利。
其實(shí)通過 widget->setWindowFlags(Qt::Window | Qt::WindowTitleHint); 可以把 min, max 按鈕給去了姑裂,這樣的 widget 的 width 就可以比之前更小一點(diǎn)啦,
sizePolicy?
這個(gè)屬性保存了該 widget 的默認(rèn)布局屬性男旗,如果它有一個(gè) layout 來布局其子 widgets舶斧,那么這個(gè) layout 的 size policy 將被使用;如果該 widget 沒有 layout 來布局其子 widgets剑肯,那么它的 size policy 將被使用捧毛。默認(rèn)的 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 默認(rèn)的 sizePolicy 是垂直方向 Fixed呀忧,水平方向 Preferred,故水平方向會(huì)伸展
QSizePolicy::Preferred 和 QSizePolicy::Expanding 的區(qū)別:兩者都可以伸展和收縮溃睹,但是區(qū)別在于誰可以伸展地更牛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(在水平方向上而账,垂直方向不構(gòu)成額外空間競(jìng)爭關(guān)系):
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(在水平方向上構(gòu)成競(jìng)爭關(guān)系)。