簡體   English   中英

如何更改/交換小部件的布局?

[英]How to change/swap the layout of a widget?

我正在開發一個應用程序,在其中按下單選按鈕時需要更改當前選項卡的布局。

我正在使用以下代碼交換布局:

changed_layout = new QVBoxLayout;
label1 = new QLabel(string);
delete main_layout;
changed_layout->addWidget(label1);
setLayout(changed_layout);

但是,當我單擊按鈕時,軟件退出(崩潰)。

您不應該嘗試使用delete直接刪除QObjectsojbect->deleteLater()調用ojbect->deleteLater()並將指針設置為null 在退出任何插槽並且控制權返回事件循環后,Qt框架將安全刪除該對象。

在代碼中,更改行delete main_layout; 至:

main_layout->deleteLater();
main_layout = NULL;

更新:來自Steve S的評論是正確的。 引用Qt文檔setLayout()

如果此窗口小部件上已經安裝了布局管理器,則QWidget將不允許您安裝另一個。 必須先刪除現有的布局管理器(由layout()返回),然后才能使用新的layout.layout調用setLayout()。

因為setLayout()是重設窗口小部件的特殊情況,所以我們必須先刪除舊的布局,然后再設置新的布局。 我們必須非常確定要調用delete()的信號/插槽調用堆棧。

另一種方法是設置新的布局盡可能然后狹槽連接到舊的布局destroyed()信號,然后調用deleteLater()就可以了。 在destroy()信號的插槽中,您應該能夠使用新布局調用setLayout()

如果聽起來很復雜,那是因為。 在運行時更改和銷毀布局是不尋常的。 如果發現必須做這樣的事情,我可能會在層次結構的頂部創建類似gridLayout的東西,並在其中設置不同的布局,然后將子窗口小部件從一個布局移到另一個布局,而無需創建並在運行時銷毀它們。

暫無
暫無

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

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