日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QStackedWidget实现自适应紧凑布局

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现自适应紧凑布局的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。