QT sizeHint 及 Policy的用法

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)系)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末因篇,一起剝皮案震驚了整個(gè)濱河市泞辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竞滓,老刑警劉巖咐吼,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異商佑,居然都是意外死亡锯茄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門茶没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肌幽,“玉大人,你說我怎么就攤上這事抓半∥辜保” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵笛求,是天一觀的道長廊移。 經(jīng)常有香客問我,道長探入,這世上最難降的妖魔是什么狡孔? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮新症,結(jié)果婚禮上步氏,老公的妹妹穿的比我還像新娘。我一直安慰自己徒爹,他們只是感情好荚醒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隆嗅,像睡著了一般界阁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖喳,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天泡躯,我揣著相機(jī)與錄音,去河邊找鬼。 笑死较剃,一個(gè)胖子當(dāng)著我的面吹牛咕别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播写穴,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼惰拱,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了啊送?” 一聲冷哼從身側(cè)響起偿短,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馋没,沒想到半個(gè)月后昔逗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篷朵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年勾怒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片款票。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡控硼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾少,到底是詐尸還是另有隱情卡乾,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布缚够,位于F島的核電站幔妨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谍椅。R本人自食惡果不足惜误堡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雏吭。 院中可真熱鬧锁施,春花似錦、人聲如沸杖们。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘完。三九已至姥饰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孝治,已是汗流浹背列粪。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工审磁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岂座。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓态蒂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掺逼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吃媒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361