您好,登錄后才能下訂單哦!
今天小編給大家分享一下pyqt5控件自適應窗口怎么應用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
自適應其實很簡單,只要搞懂原理,你就能隨心所欲地去布置你的頁面了。
它的基礎是布局,有了布局,再在布局中放置各種控件,我們就能讓控件實現自適應的效果,即:不管是點擊最大化按鈕之前還是之后,控件的大小比例都能跟隨窗口大小的變化而變化。
先了解一下布局,主要有以下3種:
水平布局(H) | 里面的控件會水平排布,即從左到右放置 |
垂直布局(V) | 里面的控件會垂直排布,即從上到下放置 |
柵格布局(G) | 控件呈網格排布,上下左右都可以放置 |
還有其它布局,但是用的不多,本文暫且不提。
打開Qt Designer,新建一個窗口,拖進一個frame控件,然后通過布局來讓其自適應窗口。如下圖所示:
從右側的對象查看器中我們可以看到,有2個圖標的右下角是打了紅色的禁止符號,這就代表當前對象是沒有使用布局的。前面我們說到,如果控件沒有在布局中,那么它就不能自適應窗口。
那我們如何讓這個frame控件自適應窗口呢?其實很簡單,因為我們的目的是讓這個frame去自適應窗口,那么我們就將整個窗口作為一個布局容器就行了。
具體做法就是,將鼠標點擊窗口中沒有控件的空白處,再點擊右鍵,設置水平布局就可以了。注意:不是灰色區域!步驟如下圖所示:
設置完成后,你就會發現,frame的大小直接和窗口大小一致了。再觀察右側對象查看器中,frame對象上面的centralwidget的布局圖標是正常顯示了,剛剛的紅色禁止標志已經消失了。如下圖所示:
是不是這樣就結束了?理論上是的,但是還不夠完美。如果你仔細觀察就會發現,frame的邊緣和窗口的藍色邊緣并不是完全貼合的,這就會導致邊緣會有一定的空隙,也是比較影響美觀的。
因為在Qt Designer中,布局里是會默認留出空隙的,需要我們自己手動調整一下,調整步驟如下:
第1步,我們鼠標單擊對象查看器中的centralwidget,再單擊屬性編輯器(或者按組合鍵:Ctrl + I,字母i,不是1),對centralwidget進行具體的設置。
第2步,將centralwidget的屬性欄滑到最底部,我們會看到有個名叫Layout的屬性,然后將里面的數值全部改成0即可。
如下圖所示:
屬性含義我給大家翻譯一下,對照上圖了解一下即可,不需要死記硬背:
layoutName(布局名稱) | horizontalLayout(水平布局) |
layoutLeftMargin(布局左邊距) | 9 |
layoutTopMargin(布局上邊距) | 9 |
layoutRightMargin(布局右邊距) | 9 |
layoutBottomMargin(布局底邊距) | 9 |
layoutSpacing(布局間距) | 6 |
layoutStretch(布局拉伸) | 0 |
layoutSizeConstraint(布局尺寸約束) | SetDefaultConstraint(設置默認約束) |
在Qt Designer中,按組合鍵:Ctrl + R預覽設計,再點擊右上角的最大化按鈕測試一下,frame也完美和窗口大小保持一致了。如果不方便觀察,可以先將frame的背景色設置成任意彩色就能很清楚地去觀察了。
至此,我們的基礎示例就完成了。
上面的基礎示例中只添加了1個布局,但是只要我們的程序稍微復雜一些,都會用到很多控件,每個控件在窗口中的位置也不同。
比如現在非常大眾化的左側菜單,右側工作區的布局模式,如下圖所示:
這種布局模式很經典,也很直觀。我們從Qt的角度去看這張圖,左側黑色是一個treeWidget,右側是一個stackedWidget,然后stackedWidget里面還有很多控件。
那么以此為例,因為treeWidget和stackedWidget是左右放置的,那么我們就可以用水平布局來設置。
根據上面的基礎示例,我們分別拖拽1個treeWidget和1個stackedWidget進來,然后單擊窗口空白處,鼠標右鍵設置水平布局,最后把Layout屬性下的數值全部設置為0,結果如下圖所示:(為了便于大家觀察,我把stackedWidget的背景設置成淺灰色)
從圖中我們看到,菜單欄和工作區在窗口中對半展示了,這個結果并不是我們想要的。所以我們還需要設置一下這2個控件的顯示比例,設置方法同上:我們還是單擊centralwidget,然后找到Layout屬性下的layoutStretch(布局拉伸),默認是“0,0”,現在我們將其設置為“1,3”。
這里的布局拉伸,你可以理解為拉伸比例,00就是對半展示,13就是1比3展示。修改數值后,我們驚喜地發現界面變成了下面這樣:
展示的比例是基本符合我們的要求了,但是按組合鍵Ctrl + R預覽,再點擊最大化按鈕后發現,界面變成了下面這樣:
還是不對勁,最大化之后雖然菜單欄和工作區的比例還是1比3,但是這個比例對于菜單來講還是太寬了,顯得菜單上的字很密很小。當然,菜單上的字體大小和間距我們也是可以調整的,但是1比3的比例對于菜單欄上最長只有4個字的項來說,還是太寬了。
所以我們的目的就很明顯了,就是要將菜單欄的寬度再縮小一些。寬度縮小,這就涉及到具體數值的修改了,而剛剛的比例修改只能是整數,不能精確到小數點后幾位。
那么具體怎么做呢?方法如下:
因為我們只是對菜單欄修改,所以在對象查看器中,我們鼠標單擊選中treeWidget,按組合鍵Ctrl + I或者單擊底部的屬性編輯器進入treeWidget的具體屬性界面,找到一項名為maximumSize(最大尺寸)下的寬度后面的16777215修改成180。如下圖所示:
修改好菜單欄的最大寬度之后,我們再預覽一下,發現菜單欄的寬度被固定了,只有垂直高度是隨窗口大小的變化而變化的。這樣的結果就基本符合我們的預期了。
看到這里,可能有小伙伴會問:哎,不對呀角角,你這第三個標題上不是寫著布局嵌套布局嗎?怎么只是比基礎示例多了個控件而已?
別急哈~ 我下面要講的才是重點哦~
通過剛剛的例子,相信大家對水平布局已經很熟悉了。現在呢,咱們可以思考一下:是否可以將某一個布局作為控件再放到窗口的水平布局中去呢?答案是肯定的。
我們可以看到,上面我放的一張網圖中,工作區中是有很多大大小小的控件在其中的。所以我們在工作區即stackedWidget中,還要再加布局才行。
我們再拖拽3個frame到stackedWidget中,然后按Ctrl鍵不放依次選中3個frame并設為水平布局,如下圖所示:
預覽一下我們發現,窗口最大化之后底部的2個菜單欄和工作區的大小是正常變化的,但是這3個frame卻是紋絲不動。
動腦筋想想,是不是哪里少了一步?
噢!對了,之前在設置底部2個控件的時候是不是在窗口的空白處又設置了一下水平布局?那我們依樣畫葫蘆再在stackedWidget的空白處鼠標右鍵加一個水平布局,發現結果變成下面這樣……
這肯定不是我們想要的,那是不是因為控件太少了,所以這3個frame才把stackedWidget里面全占滿了呢?并不是,如果我們再拖拽控件進去,依然是這樣排布,因為這3個frame外面最鄰近的布局是水平布局,只要在水平布局里面,放再多控件也還是從左到右排布的。
那么現在有2種解決辦法:
第1種,是選中frame外的水平布局右鍵修改成柵格布局,這樣上下左右就都能放控件了,也能正常隨著窗口大小自適應了,這個也算是布局嵌套布局了,但是只嵌套了一層而已。
第2種,是打破布局,即刪除當前窗口中所有的布局,然后再重新布局。操作方法:鼠標單擊窗口空白處,點擊鼠標右鍵,單擊布局,找到打破布局再點擊即可。如下圖所示:
這樣,所有的布局就會被一鍵全部刪除,控件也會被隨機擺放在窗口中,大小也有所變化。但是別慌,打破布局之后,我們先觀察一下下面這張網圖:
區域①是一個菜單,這是單獨的1個treeWidget控件,由于它的高度是和窗口的寬度是相等的,所以我們是不是就可以將區域②③④看做一個整體和區域①做一個水平布局?
然后再觀察②③④,這3個是不是上下排布的?所以我們把這3個設置成垂直布局。再然后,我們看到區域③里面是不是又有3個frame是水平排布,那再把這3個設置到一個水平布局中。
因為左邊只有1個菜單,右邊的控件是很多的,所以我們先把右邊的控件從上到下依次設置進布局中,然后選中②③④的布局,再右鍵給外面套一個垂直布局。
最后我們選中菜單欄,然后再選中工作區最外面的垂直布局,再右鍵套一個水平布局,這樣就大功告成啦!
需要注意的是:如果窗口中需要多層布局時,一定要按照從里到外、從小到大的順序設置布局。
這個是表格控件,我之前在使用時,發現它在設置布局之后,控件的大小雖然是跟隨窗口大小改變的,但是表格里的數據卻不是自適應控件體的,這個需要在業務邏輯代碼中加一句如下代碼:
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive | QHeaderView.Stretch)
以上就是“pyqt5控件自適應窗口怎么應用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。