qt布局問題

2021-08-03 16:32:36 字數 2446 閱讀 6426

替乙個widget設定布局有兩種方法。

1layout 建構函式傳遞qwidget

qvboxlayout* mainqvboxlayout=new qvboxlayout(mainwidget);

2layout建構函式傳遞null,呼叫qwidget的setlayout設定布局

qvboxlayout* mainqvboxlayout=new qvboxlayout();

mainwidget->setlayout(mainqvboxlayout);

注意,當乙個widget已經存在布局的時候。呼叫setlayout會失敗,如果要設定,必須先通過widget的 layout方法(

qlayout *

layout

() const

)得到原來的指標,然後刪除再呼叫setlayout。 

q:得到layout指標,delete後就能重新設定,不需要其他操作怎麼做的?

a:widget使用setlayout的時候會檢查原有的值是否為null,如果不為null就失敗,delete layout的時候,析構函式會將這個layout屬於的widget的這個值設定為0。

所以delete以後又可以設定了

qlayout::~qlayout()

q:為什麼mainwindow呼叫setlayout失敗?

a:mainwindow是乙個組合體,已經包含了預設的layout,要通過setcenterwidget來操作中間的一塊區域。

v h boxlayout

在乙個layout裡面新增另乙個layout如下

funcbarqhboxlayout=new qhboxlayout();

mainqvboxlayout->addlayout(funcbarqhboxlayout);

q: delete mainqvboxlayout的時候 funcbarqhboxlayout會被刪除嗎,還是需要自己處理?

a:不需要自己處理。刪除mainqvboxlayout的時候會自動刪除他add的layout

qboxlayout::~qboxlayout()

在h 或者v layout裡面新增乙個控制項呼叫

layout->addwidget(***) 這個是依照次序新增的。從左到右,從上到下。

如果有些子類已經實現了一些spacer函式,比如vbox hbox,那麼用新增spacer用addspaceritem

一般不直接使用layout->additem() additem定義了如何新增,由子類實現,通常用layoutitem封裝乙個widget或者spacer,把不同的類物件變成layout可以識別的

統一layoutitem,laytouitem可以容納很多東西

彈簧控制項的構造和使用

spaceritem(w,h,hpolicy,vpolicy)

w是優先的高度h是優先的寬度

hpolicy是水平方向上的策略

vpolicy是垂直方向上的策略。

如果是水平彈簧 那麼hpolicy=expanding vpolicy=minimum

如果是垂直彈簧那麼hpolicy=minimum vpolicy=expanding

gridlayout 新增控制項和spacer

新增控制項用addwidget

新增spacer用additem

不管用哪個函式都要了解他的四個關鍵引數

row               控制項起始單元格的行位置

column        控制項起始單元格的列位置

rowspan      控制項所佔的行個數

columnspan 控制項所佔的列個數

例如 0 0 2 1就是該控制項排放在0,0起始的位置,佔2行1列。

例如 2 3 4 2就是該控制項排放在2,3起始的位置,佔4行2列。

同時需要設定控制項的policy。

布局還有乙個重要的值。是伸縮因子stretch

stretch反應的是控制項和控制項之間的比例。比如

setstretch(0,1)第0個位置的伸縮因子為1

setstretch(1,2)第1個位置的伸縮因子為2

因此第二個控制項的大小盡量為第乙個的兩倍。只能是盡量,因為還有其他的條件限制。比如maxsize,minsize,或者fixed策略minimal策略之類的。

另外乙個是調控控制項的間隔和邊界部分

layout可以使用 setspacing設定控制項之間的間隔。gridlayout使用 setverticalspacing或者sethorizontalspacing 來設定

layout通過使用setcontentmargins來設定四周留白的間隔。

部分 widget 可以通過setcontentmargins來設定四周留白的間隔。setcontentmargins主要是為layout設計使用的。不是所有的widget都可以使用,有部分是可以的比如label這一類,具體是否有用要看這個控制項的具體實現。比如combobox就是不可以的。

QT筆記 布局

1 qt中使用布局器qlayout布局 2自動計算各個空間的大小和位置 採用的既定policy策略來調整子視窗的大小和位置 3qhboxlayout橫向布局 qvboxlayout縱向布局 使用三部曲 1 建立控制項物件 2 建立布局器 3 使用布局器 mywin.h 1 ifndef mywin ...

Qt的布局 部件布局

qt提供了幾個類使得部件布局更加簡單。qgroupbox qbuttongroup qsplitter qwidgetstack 1 qgroupbox類 用於在部件周圍繪製乙個框架。可以在框架的上端新增一些描述資訊。qgroupbox groupbox new qgroupbox this gro...

QT布局實踐1 布局雛形

一直以來對布局感覺get不到點,最近就花點時間來實踐一下,弄乙個純手動布局的介面。力求做到全適應。做乙個介面慢慢加東西把,大概是下面圖的樣子,紅色區域隨意伸縮,綠色區域也是,但是寬度有最大值和最小值。藍色和橙色是固定的高,只能進行左右伸縮。大概就是先在qhboxlayout1 中加入紅綠,qhbox...