刪除QGridLayout中的Widget

2021-07-14 15:14:27 字數 2413 閱讀 6504

1.新建乙個工程,然後刪除mainwindow的ui,標頭檔案和原始檔。

2.新建乙個主視窗,布局如下:

3.新建乙個視窗作為子視窗,用於動態加入到widgetgridlayout布局中。

實現addwidget按鈕槽函式

void form::on_btnaddwidget_clicked()

實現removewidget按鈕槽函式

void form::on_btnremovewidget_clicked()

else

}

其中clearlayout()函式的實現如下:

void form::clearlayout(qlayout *layout)

//刪除子布局

qlayout *childlayout = item->layout();

if(childlayout)

delete item;}}

然後執行程式,反覆操作addwidget和removewidget,我們看到的輸出資訊如下:

表明已成功刪除qgridlayout中的widget。

如果我們把addwidget槽函式中的addwidget改為如下:

ui->widgetgridlayout->addwidget(widget);

//ui->widgetgridlayout->addwidget(widget,0,0,qt::aligncenter);

然後執行,我們發現結果變化了

子視窗中的qgridlayout會隨著增加次數而增加。

這就有個問題了,為什麼qgridlayout都已經為空了,它的行數卻還不斷增加呢?

看下qgridlayout源**找下原因。因為addwidget(widget*),它直接使用qgridlayout.h中的

inline

void

addwidget(qwidget *w)

qlayout.cpp中關於addwidget的實現:

void qlayout::addwidget(qwidget *w)

其中addchildwidget的作用是把w作為布局的管理部件;additem在qlayout中定義為虛類,所以它的功能需要返回到qgridlayout中檢視additem的實現,它的功能就是將在qgridlayout中指定行,列來放置包含w的項。

void qgridlayout::additem(qlayoutitem *item)

inline

void getnextpos(int &row, int &col)

additem帶三個引數的函式

void qgridlayout::additem(qlayoutitem *item, int row, int column, int rowspan, int columnspan, qt::alignment alignment)

add函式的實現

void qgridlayoutprivate::add(qgridbox *box, int row, int col)

在來看看setnextposafter(row, col)函式:

void qgridlayoutprivate::setnextposafter(int row, int col)

}} else }}

}

至此,就基本差不多了,我們知道如果不指定行和列的話,每次呼叫addwidget都會執行到add函式中的

expand(row + 1, col + 1);
根據setnextposafter函式可知,我們每次增加行會自增1,但列保持不動,這和實際的輸出結果也吻合。

QGridLayout類中常用的方法

qgridlayout類中常用的方法 方法 描述 addwidget qwidget widget,int row,int col,int alignment 0 給網格布局新增部件,設定指定的行和列,起始位置的預設值為 0,0 widget 所新增的控制項 row 控制項的行數,預設從0開始 co...

MVC中的刪除

刪除 刪除附件資訊 錯誤寫法 listdbfiles from tbfile in mymodel.pw file where tbfile.noticeid noticeid select new pw file tolist 雖然表面看上去沒問題,但是這種語法在linq中寫法會報錯的.主要衝突在...

gorm中的刪除

刪除一條記錄時,刪除物件需要指定主鍵,否則會觸發 批量 delete,例如 db.debug where id 6 delete new user delete from users where id 6 db.debug delete user 5 delete from users where ...