[英]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
直接刪除QObjects
, ojbect->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.