QT 的Scene-View系統中的LinearLayout 相當於原來的 HBoxLayout 和 VBoxLayout,用來處理橫行排版和豎向排版。
QGraphicsLinearLayout處理Qt::Horizontal和Qt::Vertical兩個方向的排版布局,默認為Qt::Horizontal,可以通過調用接口setOrientation(),並傳遞參數Qt::Vertical來構造垂直方向的QGraphicsLinderLayout。
通常用parent=NULL的方式在堆上構建 QGraphicsLInderLayout(也就是 QGraphicsLinearLayout * layout = new QGraphicsLinearLayout(NULL) ),
然后通過調用接口addItem()的方式增加wdiget 和 sub layout,完成創建后,在設置layout的方向以及調用QGraphicsWidget::setLayout()接口對構建的layout進行綁定。
可以通過接口addItem(), addStretch(), insertStretch(), setStrethFactor() 給 layout 增加 widgets, layouts, stretches, 通過 setItemSpacing 給layout 設置 spacing,並且layout擁有item的所有權。在一些情況下,當 item 是從QGraphicsItem(或者QGraphicsWidget)多層繼承過來的,這個時候再item的所有權會出現混亂的現象,因為item這個時候屬於兩個所有權層次體系。參考QGraphicsLayoutItem::setOwnedBylayout()相關文檔,確認所有權問題的處理方式。通過接口count()和itemAt()可以遍歷item, 通過removeAt 和 removeItem() 可以移除 layout 里面的 item, 這個時候只是剝離item 和 layout 的所有權關系,但並不銷毀相關item。
link: QGraphicsLayoutItem::setOwnedBylayout() : 設置 一個layout 是否在析構的時候需要delete 當前item。
名詞解釋:
alignment : 對齊方式
Stretch Factor :伸展因子
orientation :伸展方向
reimplemented :重載實現
spaceing ,space : 間隔, 占位
大小策略
QGraphicsLinearLayout盡量尊重每一個item自己的size hints 和 size policies,當 layout 擁有比填充完所有items 更多的空間的時候會 根據layout的針對當前item的alignment排列每一個item的,你也可以對每一個item調用setAlignment()設置對齊方式。默認情況下item是左上角對齊的。
item之間的空格策略
layout會在item之間分配一些空格。實際的空格大小依賴於layout當前所屬的widget的style,通常的空格大小是4,你也可以通過調用接口setSpacing()來設置,如果想針對每一個Item設置獨立的space,可以調用接口setItemSpacing()。
布局中的伸展策略
可以為每一個item設置一個伸展因子,控制當前item比其他的item獲取更多的空間。默認情況下,兩個同類型的widget,排列在一個linearLayout中將會獲得同樣大小的空間,但是,如果第一個widget設置伸展因子為1,第二個設置伸展因子為2,那么第一個widget會獲得1/3的可用空間,而第二個widget會獲得2/3的可用空間。
QGraphicsLinearLayout通過累加所有item的伸展因子,然后根據伸展因子的比例分配可用空間。對於所有item來說,默認的伸展因子是0,也就是意味着item沒有設置伸展因子,這種情況下,和所有item設置伸展因子為1,效果上是一樣的。伸展因子只對LineraLayout布局的延展方向有效。如果要控制item的兩個方向,你可以考慮用QGraphicsGridLayout代替線性布局。
QGraphicsLinearLayout 對比其他布局
QGraphicsLinearLayout和QVBoxLayout,QHBoxLayout功能類似,只不過這里管理的是QGraphicsWidget和QGraphicsLayout,而不是QWidget和QLayout。
成員函數表:
void QGraphicsLinearLayout::addItem ( QGraphicsLayoutItem * item )
相當於調用 insertItem(-1, item).
void QGraphicsLinearLayout::addStretch ( int stretch = 1 )
相當於調用 insertStretch(-1, stretch).
Qt::Alignment QGraphicsLinearLayout::alignment ( QGraphicsLayoutItem * item ) const
返回 item的對齊方式. 默認是 Qt::AlignTop | Qt::AlignLeft.
對齊方式是在layout在填充完item后有剩余空間的時候用什么想對坐標系來設置item的坐標。
[一種對齊方式在邏輯上定義了一種想對坐標系]
int QGraphicsLinearLayout::count () const [virtual]
Reimplemented from QGraphicsLayout::count().
void QGraphicsLinearLayout::insertItem ( int index, QGraphicsLayoutItem * item )
在索引index處插入一個item,或者換種說法是在當前索引為index的item的前面插入一個新的item。
void QGraphicsLinearLayout::insertStretch ( int index, int stretch = 1 )
在索引index處插入一個伸展因子(伸展占位),或者說是在當前索引為index的item簽名插入伸展因子。
注意:這里的用於插入,是帶有兩層意思的,如果index指定的地方沒有item則會生成空白item,並設置相應為的stretch,如果有item責直接設置相應為的stretch。[猜測,待考證]
void QGraphicsLinearLayout::invalidate () [virtual]
重載 QGraphicsLayout::invalidate().
QGraphicsLayoutItem * QGraphicsLinearLayout::itemAt ( int index ) const [virtual]
重載 QGraphicsLayout::itemAt().
從0遞增,返回的item和視覺順序是匹配的。
qreal QGraphicsLinearLayout::itemSpacing ( int index ) const
返回索引為index的item 和索引為(index+1)的item之間的空格大小
Qt::Orientation QGraphicsLinearLayout::orientation () const
返回layout的伸展方向
void QGraphicsLinearLayout::removeAt ( int index ) [virtual]
重載實現 QGraphicsLayout::removeAt()
在布局層級樹上移除item, 但並沒有銷毀item,
調用移除后,item的所有權轉交給調用者。
注意:自定義的布局類盡量不要改變原有設計的行為意圖,免得破壞原有設計者的結構依賴,導致不可預知問題
void QGraphicsLinearLayout::removeItem ( QGraphicsLayoutItem * item )
語義同 removeAt(int index)
void QGraphicsLinearLayout::setAlignment ( QGraphicsLayoutItem * item, Qt::Alignment alignment )
設置item的對齊方式,layout調用后,會導致布局失效,自動調用invalidated()
void QGraphicsLinearLayout::setGeometry ( const QRectF & rect ) [virtual]
重載實現 QGraphicsLayoutItem::setGeometry().
void QGraphicsLinearLayout::setItemSpacing ( int index, qreal spacing )
設置索引為index的item和索引為(index+1)的item之間的空格大小
void QGraphicsLinearLayout::setOrientation ( Qt::Orientation orientation )
設置layout的伸展方向,會自動調用 invalidated()
void QGraphicsLinearLayout::setSpacing ( qreal spacing )
設置layout的item間隔,space代表的是在layout伸展方向兩個item之間的空格大小
void QGraphicsLinearLayout::setStretchFactor ( QGraphicsLayoutItem * item, int stretch )
設置item的伸展因子,如果layout中item的的stretch有變化,則會導致layout 的失效。設置stretch為0的話,就回移除相應item的伸展因子,在效果上等價於設置stetch為1。
QSizeF QGraphicsLinearLayout::sizeHint ( Qt::SizeHint which, const QSizeF & constraint = QSizeF() ) const [virtual]
重載實現 QGraphicsLayoutItem::sizeHint().
qreal QGraphicsLinearLayout::spacing () const
返回layout的item間隔.
int QGraphicsLinearLayout::stretchFactor ( QGraphicsLayoutItem * item ) const
返回指定item的伸展因子。默認的伸展因子是0,也就是說沒有為當前item設置過伸展因子
解析QT排版引擎:
先總體來看一下,Qt的布局類型,
總共三個種類,QGraphicsLinerLayout, QGraphicsGridLayout
(待續)