QStackedWidget实现自适应紧凑布局
前言
本文提出了一種使QStackedWidget尺寸根據內容自適應調整的解決方法。
問題提出
我們知道,QStackedWidget可以包含多個可切換的子窗口。多個子窗口的高度不一樣時,此時將QStackedWidget放在一個垂直布局中,所有子窗口會保持和最高的子窗口相同的高度,從而導致高度原本較少的子窗口出現空白區域,看起來十分不緊湊。如何讓QStackedWidget尺寸根據子窗口內容自動調整呢?
原因分析
原因顯而易見,QStackedWidget雖然顯示當前子窗口,但是當前子窗口的高度會受到其他子窗口的影響。
下面嘗試解決此問題。
1. 添加垂直彈簧VerticalSpacer
要想自適應,當然需要加彈簧,加了彈簧后,切換子窗口,所有子窗口還是保持相同的高度,說明還是需要進一步修改。
2. 隱藏非當前子窗口及其的內容(無效方法)
切換到當前子窗口時時,把其他子窗口隱藏。經測試這種方法是無效的。因為從QStackedWidget源碼中可以看到,在切換當前子窗口時,其他子窗口已經被隱藏了,我們再隱藏是徒勞的。
3. 添加布局(有效方法)
解決方法是在每個子窗口里加一個垂直布局,將原本的子窗口內容作為一個content_widget放到新加的布局里。在顯示當前頁面時,隱藏其他頁面的content_widget即可。
void showStackedWidgetPage(QStackedWidget *stackedWidget, int idx) {stackedWidget->setCurrentIndex(idx);// 經測試,隱藏page是不行的,需要隱藏page里面的content_widgetint page_count = stackedWidget->count();for (int i = 0; i < page_count; i++){QWidget *page = stackedWidget->widget(i);QObjectList objects = page->children();for (int j = 0; j < objects.size(); j++){QWidget *content_widget = qobject_cast<QWidget *>(objects.at(j));if (content_widget){content_widget->setVisible(i == idx);break; // 這里只是跳出當前頁的for循環}}} }同理,對于水平不緊湊的問題,就采用添加水平布局來解決。
總結
根據以上內容,猜測可能的原因如下:
因為QStackedWidget里面是使用QStackedLayout實現的,可能是由于QStackedWidget里面的QStackedLayout,和普通的QVBoxLayout、QHBoxLayout在內部元素隱藏時,處理方式不一致導致的。即QStackedLayout中子窗口隱藏,不會留出可被VerticalSpacer壓縮的空間,但QVBoxLayout和QHBoxLayout在內部元素隱藏時,會將釋放的空間作為可壓縮空間被VerticalSapce壓縮,從而實現了緊湊的自適應布局。
如果您覺得文章有用,可以關注一下筆者公眾號。
總結
以上是生活随笔為你收集整理的QStackedWidget实现自适应紧凑布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝马3系的价格、7系的尺寸!凯迪拉克CT
- 下一篇: 【手算】行列式树形展开