首先看一下布局器大概的類關係及資料資訊
以gridlayout為例進行說明,我們一般使用additem方法,引數傳入的是qlayoutitem物件,如新增qspaceritem(繼承自qlayoutitem,呼叫additem方法),它就沒有widget相關資訊了。
如果addwidget新增widget時,實際上是new的qwidgetitem,裡面會儲存wid資訊,它是繼承自qlayoutitem的,然後additem,傳入剛才new的qwidgetitem。
void qgridlayout::addwidget(qwidget *widget, int row, int column, qt::alignment alignment)
addchildwidget(widget); // 設定父物件,將widget的parent設定為layout的parent
qwidgetitem *b = qlayoutprivate::createwidgetitem(this, widget); // new乙個qwidgetitem,qwidgetitem是繼承自qlayoutitem的
additem(b, row, column, 1, 1, alignment);
後面會new乙個qgridbox,new的時候會儲存前面的qlayoutitem值到_item中,析構時也會析構掉qlayoutitem,但是如果呼叫了takeat,則會返回qlayoutitem,然後將qgridbox的_item賦值為0,由返回給外部來進行釋放qlayoutitem了。所有新增的qgridbox,都會儲存到qgridlayout的資料的list中,後面itemat獲取資料也都是從這個list中遍歷的。要注意各個takeat,widget方法的執行實際上都是到了list中,也會進行很多的比對。count也就是執行的thins.size()了.
void qgridlayout::additem(qlayoutitem *item, int row, int column, int rowspan, int columnspan, qt::alignment alignment)
另外注意,addwidget的rowcount之類的是一直自增的,如果為每個物件的rowindex或columnindex都改變,效能不好,所以qt是沒有改變行,列索引的。使用中要注意。
如果layout中不斷removewidget,addwidget,行,列資訊會不確定是什麼值的了。
如果我們繼承layout,並且重新實現setgeometry的話,可以自己實現布局中特殊的設定。流程大概如下
qwidget大小改變後
if (qlayout *layout=widget->d_func()->layout) {
layout->widgetevent(e); .//如果有布局器,布局器接受相關事件
// 布局器處理如下幾個訊息:
void qlayout::widgetevent(qevent *e)
switch (e->type()) {
case qevent::resize:
qresizeevent *r = (qresizeevent *)e;
d->doresize(r->size())
break;
case qevent::childremoved
break;
case qevent::childinserted:
break;
case qevent::layouthint
break;
case qevent::layoutrequest:
void qlayoutprivate::doresize(const qsize &r)
q->setgeometry(rect);
對於qgridlayout的setgeometry,具體實現大概如下:
int n = things.size();
for (i = 0; i < n; ++i) {
qgridbox *box = things.at(reverse ? n-i-1 : i);
box->setgeometry(qrect(x, y, w, h));
對每個box設定大小位置
當然,我們也可以過載實現qlayout中的takeat,insertitem等方法,使用自己的list來儲存設定到layout中的各個物件。
Fabric 原始碼解析 原始碼目錄解析
這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...
Spring原始碼解析之 Aop原始碼解析(2)
spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...
Integer原始碼解析
public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...