摘要:布局管理在一個程序里,布局是一個很重要的方面。布局就是如何管理應用中的元素和窗口。和是基本的布局類,分別是水平布局和垂直布局。上面的例子完成了在應用的右下角放了兩個按鈕的需求。這種布局是把窗口分為行和列。
布局管理
在一個GUI程序里,布局是一個很重要的方面。布局就是如何管理應用中的元素和窗口。有兩種方式可以搞定:絕對定位和PyQt5的layout類
絕對定位每個程序都是以像素為單位區(qū)分元素的位置,衡量元素的大小。所以我們完全可以使用絕對定位搞定每個元素和窗口的位置。但是這也有局限性:
元素不會隨著我們更改窗口的位置和大小而變化。
不能適用于不同的平臺和不同分辨率的顯示器
更改應用字體大小會破壞布局
如果我們決定重構(gòu)這個應用,需要全部計算一下每個元素的位置和大小
下面這個就是絕對定位的應用
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows three labels on a window using absolute positioning. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QWidget, QLabel, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 = QLabel("Zetcode", self) lbl1.move(15, 10) lbl2 = QLabel("tutorials", self) lbl2.move(35, 40) lbl3 = QLabel("for programmers", self) lbl3.move(55, 70) self.setGeometry(300, 300, 250, 150) self.setWindowTitle("Absolute") self.show() if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們使用move()方法定位了每一個元素,使用x、y坐標。x、y坐標的原點是程序的左上角。
lbl1 = QLabel("Zetcode", self) lbl1.move(15, 10)
這個元素的左上角就在這個程序的左上角開始的(15, 10)的位置。
程序展示:
盒布局使用盒布局能讓程序具有更強的適應性。這個才是布局一個應用的更合適的方式。QHBoxLayout和QVBoxLayout是基本的布局類,分別是水平布局和垂直布局。
如果我們需要把兩個按鈕放在程序的右下角,創(chuàng)建這樣的布局,我們只需要一個水平布局加一個垂直布局的盒子就可以了。再用彈性布局增加一點間隙。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we position two push buttons in the bottom-right corner of the window. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): okButton = QPushButton("OK") cancelButton = QPushButton("Cancel") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 300, 150) self.setWindowTitle("Buttons") self.show() if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
上面的例子完成了在應用的右下角放了兩個按鈕的需求。當改變窗口大小的時候,它們能依然保持在相對的位置。我們同時使用了QHBoxLayout和QVBoxLayout。
okButton = QPushButton("OK") cancelButton = QPushButton("Cancel")
這是創(chuàng)建了兩個按鈕。
hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton)
創(chuàng)建一個水平布局,增加兩個按鈕和彈性空間。stretch函數(shù)在兩個按鈕前面增加了一些彈性空間。下一步我們把這些元素放在應用的右下角。
vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox)
為了布局需要,我們把這個水平布局放到了一個垂直布局盒里面。彈性元素會把所有的元素一起都放置在應用的右下角。
self.setLayout(vbox)
最后,我們就得到了我們想要的布局。
程序預覽:
柵格布局最常用的還是柵格布局了。這種布局是把窗口分為行和列。創(chuàng)建和使用柵格布局,需要使用QGridLayout模塊。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we create a skeleton of a calculator using a QGridLayout. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) names = ["Cls", "Bck", "", "Close", "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"] positions = [(i,j) for i in range(5) for j in range(4)] for position, name in zip(positions, names): if name == "": continue button = QPushButton(name) grid.addWidget(button, *position) self.move(300, 150) self.setWindowTitle("Calculator") self.show() if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
這個例子里,我們創(chuàng)建了柵格化的按鈕。
grid = QGridLayout() self.setLayout(grid)
創(chuàng)建一個QGridLayout實例,并把它放到程序窗口里。
names = ["Cls", "Bck", "", "Close", "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"]
這是我們將要使用的按鈕的名稱。
positions = [(i,j) for i in range(5) for j in range(4)]
創(chuàng)建按鈕位置列表。
for position, name in zip(positions, names): if name == "": continue button = QPushButton(name) grid.addWidget(button, *position)
創(chuàng)建按鈕,并使用addWidget()方法把按鈕放到布局里面。
程序預覽:
制作提交反饋信息的布局組件能跨列和跨行展示,這個例子里,我們就試試這個功能。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we create a more complicated window layout using the QGridLayout manager. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): title = QLabel("Title") author = QLabel("Author") review = QLabel("Review") titleEdit = QLineEdit() authorEdit = QLineEdit() reviewEdit = QTextEdit() grid = QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(author, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(review, 3, 0) grid.addWidget(reviewEdit, 3, 1, 5, 1) self.setLayout(grid) self.setGeometry(300, 300, 350, 300) self.setWindowTitle("Review") self.show() if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們創(chuàng)建了一個有三個標簽的窗口。兩個行編輯和一個文版編輯,這是用QGridLayout模塊搞定的。
grid = QGridLayout() grid.setSpacing(10)
創(chuàng)建標簽之間的空間。
grid.addWidget(reviewEdit, 3, 1, 5, 1)
我們可以指定組件的跨行和跨列的大小。這里我們指定這個元素跨5行顯示。
程序預覽:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42983.html
摘要:將程序包裝在界面里,可以將輸入通過多種途徑如文本框彈出路徑選擇等輸入到程序里。將輸出通過文本框顯示出來將執(zhí)行信息如如報錯信息運行進度通過文本框或進度條顯示出來文章安排先介紹安裝和配合的使用。 作為一個程序的開發(fā)者,我們僅僅需要在相應路徑通過命令行就可執(zhí)行那個程序。但是,不懂行的人不理解這個黑框框的東西,陌生領(lǐng)域任何人都沒有安全感,所以他們是拒絕接受一個項目僅僅只是通過一個黑框框來執(zhí)行的...
摘要:坐標軸,標題,標簽,圖形樣式餅圖,柱狀圖,折線圖等等等的設置都通過的成員函數(shù)來設置完成。寫在最后因為自身能力有限,也不是科班出身,都是自學的,目前還是一名學生,所以有未盡之處還請指正,不喜勿噴。 在pyqt5中使用matplotlib 前言 雖然,qt中也提供了繪圖函數(shù),但對于初學者并不是很容易掌握,眾所周知,matplot提供了簡單,易用,強大的繪圖函數(shù),結(jié)合mumpy基本可以達到m...
摘要:首先,定義自定義信號其中來自于信號會攜帶兩個字符串類型的數(shù)據(jù)。然后,在子窗口發(fā)射這個信號最終,在父窗口槽函數(shù)接受這個信號就是槽函數(shù),用來接受信號 工具準備 編輯器: vscode OR Pycharm vscode需要安裝PYQT Integration 以及 Python 插件, Pycharm需要配置External Tools pycharm配置External Tools 配置...
摘要:首先,定義自定義信號其中來自于信號會攜帶兩個字符串類型的數(shù)據(jù)。然后,在子窗口發(fā)射這個信號最終,在父窗口槽函數(shù)接受這個信號就是槽函數(shù),用來接受信號 工具準備 編輯器: vscode OR Pycharm vscode需要安裝PYQT Integration 以及 Python 插件, Pycharm需要配置External Tools pycharm配置External Tools 配置...
摘要:簡介網(wǎng)格布局小部件提供了一個容器,它允許小部件在動態(tài)大小的網(wǎng)格中布局。創(chuàng)建方法方法向項目中的網(wǎng)格布局添加小部件參數(shù)表示該部件將被添加到的網(wǎng)格布局的和。行和列的值在類似坐標系統(tǒng)上工作,,表示左上角。行數(shù)和列數(shù)可以從容器中獲得 showImg(https://segmentfault.com/img/bVbess6?w=4000&h=1936); 簡介 網(wǎng)格布局小部件提供了一個容器,它允許...
閱讀 3677·2021-09-22 15:34
閱讀 1186·2019-08-29 17:25
閱讀 3399·2019-08-29 11:18
閱讀 1371·2019-08-26 17:15
閱讀 1740·2019-08-23 17:19
閱讀 1228·2019-08-23 16:15
閱讀 718·2019-08-23 16:02
閱讀 1335·2019-08-23 15:19