簡體   English   中英

刪除布局中的小部件

[英]Deleting widget that is in layout

如果我們將為布局中的widget運行delete widget會發生什么? 如果這個案例寫在文檔中,請給我鏈接(我沒有找到)。

代碼示例:

QLabel *l1 = new QLabel("1st");
QLabel *l2 = new QLabel("2nd");
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(l1);
layout->addWidget(l2);

QWidget *mainWidget = new QWidget;
mainWidget->setLayout(layout);
mainWidget->show();

delete l1;
l2->deleteLater();

l1l2會發生什么事情會有所不同嗎?

我相信你所做的幾乎是一樣的,盡管兩者都不能正確地從布局中刪除你應該這樣做的方式。 它們仍被遺留在布局中(如果我沒記錯的話)

第一個只是現在刪除項目。 第二個將在控件返回事件循環后刪除它。 但實際上,人們通常從布局中刪除項目的方式是從布局中取出它們(讓它有機會自行調整),然后刪除項目及其小部件(如果需要)。

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    delete child->widget();
    delete child;
}

同樣,只有在想要銷毀添加的窗口小部件時,除了包含它的布局項之外,才需要刪除窗口小部件( child->widget() )。

QLayout偵聽ChildRemoved類型的事件並相應地刪除項目。 簡單地刪除小部件是安全的。

@FrankOsterfeld 在這里

不要在連接有活動插槽的Qobjects上使用delete l1,你將遇到崩潰。 使用:l1-> hide(); L1-> deleteLater(); 這對我來說可以

通常,我不喜歡刪除Qt小部件,而是從適當的布局中刪除它們。 (如果你設置了關閉窗口上刪除屬性, Qt將刪除自己的小部件 )稍后調用刪除和刪除之間的區別是delete是正常的C ++ 刪除操作 ,它將調用析構函數並釋放與該對象關聯的內存。

Qt文檔中討論的deleteLater()方法在輸入事件循環時刪除對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM