QT Layout原始碼解析

2021-06-27 21:19:49 字數 2204 閱讀 9153

首先看一下布局器大概的類關係及資料資訊

以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之間...