一直以來對布局感覺get不到點,最近就花點時間來實踐一下,弄乙個純手動布局的介面。力求做到全適應。
做乙個介面慢慢加東西把,大概是下面圖的樣子,紅色區域隨意伸縮,綠色區域也是,但是寬度有最大值和最小值。藍色和橙色是固定的高,只能進行左右伸縮。
大概就是先在qhboxlayout1 中加入紅綠,qhboxlayout2中加入藍橙,然後再qvboxlayout 把 qhboxlayout1 和qhboxlayout2 都加進去,最後設為主視窗的布局。
qhboxlayout*abovelayout=
newqhboxlayout
();
abovelayout->addwidget(widget_display);
this->setlayout(abovelayout);當我這樣寫,發現報錯了,就是attempting to set qlayout "" on mainwindow "mainwindow",which already
has a layout 。
這個是 很重要的,mainwindow其實已經自帶有布局了,參考
解決方法:
第一步建立乙個qwidget例項,並將這個例項設定為centralwidget。
第一步建立乙個主布局mainlayout,並把所需要的所有控制項都往裡面放(工具欄、選單欄、狀態列除外)。
最一步就是將widget的布局設定為mainlayout。
現在完成的雛形,4個格仔,每個格仔拉伸都是一樣的。
接下來就是要進行布局的比例設定了。
縮放因子:stretch。這東西可以說是比例,比較易懂。
參考大神的
例如我拉伸視窗的時候,紅綠的比例要一直為5:1,那麼我可以這樣寫
abovelayout->setstretch(0,5);
abovelayout->setstretch(1,1);在布局中設定,第乙個引數為layout新增的widget的順序,我這裡0 就是紅色了。
上半部分和下班部分佔比為10:1,類似同上:
alllayout->addlayout(abovelayout,10);
alllayout->addlayout(belowlayout,1);比例設定完後,還可以設定大小縮放的策略。
策略:sizepolicy 。也就是縮放的方法選擇。常量值
描述qsizepolicy::fixed
0預設大小是唯一可以接收的改變,因此部件不能放大也不能縮小。
qsizepolicy::minimum
growflag
預設大小是最小值,並且是充分的。部件允許擴充套件,但是並不傾向擴充套件(例如:水平方向上的按鈕),不能比預設大小提供的大小更小。
qsizepolicy::maximum
shrinkflag
預設大小是最大值,假如其它部件需要空間並且不會破壞該部件,那麼該部件允許被縮小(例如:乙個分割線)。
qsizepolicy::preferred
growflag | shrinkflag
預設大小是最佳效果,部件允許放大或縮小,但不傾向於擴充套件比sizehint()大(qwidget的預設策略)。
qsizepolicy::expanding
growflag | shrinkflag | expandflag
預設大小是合理的大小,但部件允許縮小並且可用。部件可以利用額外的空間,因此它將會得到盡可能多的空間(例如:水平方向上的滑塊)。
qsizepolicy::minimumexpanding
growflag | expandflag
預設大小是最小值,並且是足夠的。部件允許使用額外空間,因此它將會得到盡可能多的空間(例如:水平方向上的滑塊)。
qsizepolicy::ignored
shrinkflag | growflag | ignoreflag
預設大小將會被忽略,部件將會得到盡可能多的空間。
由於我需要紅色盡量的大,綠色不要變太多,寫成:
qsizepolicydisplaysizepolicy=
widget_display->sizepolicy();
qsizepolicylistsizepolicy=
widget_list->sizepolicy();
displaysizepolicy.sethorizontalpolicy(qsizepolicy::expanding);
widget_display->setsizepolicy(displaysizepolicy);
listsizepolicy.sethorizontalpolicy(qsizepolicy::preferred);
widget_list->setsizepolicy(listsizepolicy);給紅色設定expanding,給綠色設定preferred。
有時又不想每個格仔變得太大或太小,可以設定他們的最大值和最小值。例如:
widget_list->setmaximumwidth(250);
widget_list->setminimumwidth(250);完成大概是這樣的:
附上這一步的原始碼:
#ifndefmainwindow_h
#definemainwindow_h
#include
#include
#include
#include
#include
#include
#include
#include
classmainwindow
:public
qmainwindow
;
#endif//mainwindow_h
#include"mainwindow.h"
mainwindow::mainwindow(qwidget*parent)
:qmainwindow(parent)
mainwindow::~mainwindow()
voidmainwindow::ui_init()
voidmainwindow::setui_above(qvboxlayout
*alllayout)
voidmainwindow::setui_below(qvboxlayout
*alllayout)
Qt 布局管理1
最近在學習qt的基礎知識。看了一些自定義qwidget外觀方法,當初步接觸一些qt布局的一些知識後感覺到很困惑。不知道各位博友有沒有這樣的困惑。1.對於qt的qwidget而言重要的就是互動。互動需要考慮兩種重要因素 外觀 行為。在qt中行為是由事件觸發的,當然qt又提供了訊號與槽機制來方便qwid...
Qt之布局管理 (1)基本布局管理
qt提供的布局類以及他們之間的繼承關係 如下圖 常用到的布局類有 qhboxlayout qvboxlayout qgridlayout三種,分別是水平排列布局 垂直排列布局 排列布局。常用的方法有addwidget 和addlayout addwidget 用於在布局中插入控制項,addlayou...
Qt的布局 部件布局
qt提供了幾個類使得部件布局更加簡單。qgroupbox qbuttongroup qsplitter qwidgetstack 1 qgroupbox類 用於在部件周圍繪製乙個框架。可以在框架的上端新增一些描述資訊。qgroupbox groupbox new qgroupbox this gro...