QStackedWidget实现自适应紧凑布局
前言
本文提出了一種使QStackedWidget尺寸根據(jù)內(nèi)容自適應(yīng)調(diào)整的解決方法。
問題提出
我們知道,QStackedWidget可以包含多個(gè)可切換的子窗口。多個(gè)子窗口的高度不一樣時(shí),此時(shí)將QStackedWidget放在一個(gè)垂直布局中,所有子窗口會(huì)保持和最高的子窗口相同的高度,從而導(dǎo)致高度原本較少的子窗口出現(xiàn)空白區(qū)域,看起來十分不緊湊。如何讓QStackedWidget尺寸根據(jù)子窗口內(nèi)容自動(dòng)調(diào)整呢?
原因分析
原因顯而易見,QStackedWidget雖然顯示當(dāng)前子窗口,但是當(dāng)前子窗口的高度會(huì)受到其他子窗口的影響。
下面嘗試解決此問題。
1. 添加垂直彈簧VerticalSpacer
要想自適應(yīng),當(dāng)然需要加彈簧,加了彈簧后,切換子窗口,所有子窗口還是保持相同的高度,說明還是需要進(jìn)一步修改。
2. 隱藏非當(dāng)前子窗口及其的內(nèi)容(無效方法)
切換到當(dāng)前子窗口時(shí)時(shí),把其他子窗口隱藏。經(jīng)測(cè)試這種方法是無效的。因?yàn)閺腝StackedWidget源碼中可以看到,在切換當(dāng)前子窗口時(shí),其他子窗口已經(jīng)被隱藏了,我們?cè)匐[藏是徒勞的。
3. 添加布局(有效方法)
解決方法是在每個(gè)子窗口里加一個(gè)垂直布局,將原本的子窗口內(nèi)容作為一個(gè)content_widget放到新加的布局里。在顯示當(dāng)前頁面時(shí),隱藏其他頁面的content_widget即可。
void showStackedWidgetPage(QStackedWidget *stackedWidget, int idx) {stackedWidget->setCurrentIndex(idx);// 經(jīng)測(cè)試,隱藏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; // 這里只是跳出當(dāng)前頁的for循環(huán)}}} }同理,對(duì)于水平不緊湊的問題,就采用添加水平布局來解決。
總結(jié)
根據(jù)以上內(nèi)容,猜測(cè)可能的原因如下:
因?yàn)镼StackedWidget里面是使用QStackedLayout實(shí)現(xiàn)的,可能是由于QStackedWidget里面的QStackedLayout,和普通的QVBoxLayout、QHBoxLayout在內(nèi)部元素隱藏時(shí),處理方式不一致導(dǎo)致的。即QStackedLayout中子窗口隱藏,不會(huì)留出可被VerticalSpacer壓縮的空間,但QVBoxLayout和QHBoxLayout在內(nèi)部元素隱藏時(shí),會(huì)將釋放的空間作為可壓縮空間被VerticalSapce壓縮,從而實(shí)現(xiàn)了緊湊的自適應(yīng)布局。
如果您覺得文章有用,可以關(guān)注一下筆者公眾號(hào)。
總結(jié)
以上是生活随笔為你收集整理的QStackedWidget实现自适应紧凑布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝马3系的价格、7系的尺寸!凯迪拉克CT
- 下一篇: 信息系统中的树