python控件布局常⽤⽅法_GUI常⽤的2种布局⽅式
GUI 的布局管理是 GUI 开发中⾮常重要的⼀个环节。⼀个设计良好的 GUI 界⾯,其对应的布局管理也是必不可少的。其中,布局管理就是管理窗⼝中部件的放置。常⽤两种⽅式来实现布局:绝对位置布局(Absolute Layout)和布局类(QLayout)。
绝对位置布局
组件不放在布局管理器中,⽽通过函数 setGeometry(x, y, width, height)来设定组件相对其⽗窗⼝的位置。其中,x,y 是组件左上⾓的坐标,width,height 是组件的宽和⾼。在绝对位置布局中,resize( ) 函数可以调整组件尺⼨,setGeometry( ) 函数可以调整组件位置和尺⼨,甚⾄重载 sizeHint( ) 函数也可以设定组件尺⼨。
采⽤绝对位置布局⽅式,组件的位置和尺⼨固定,并不会随着⽗窗⼝位置和尺⼨的改变⽽发⽣改变。
控件的使用【例 1】绝对位置布局的实现。具体代码如下:
import sysfrom PyQt5.QtWidgets import QWidget, QLabel, QApplication,
class Example(QWidget):
def __init__(self):
super().__init__()
seif.initUT()
def initUI(self):
#使⽤move()⽅法定位了每个元素,使⽤x, y坐标。x, y坐标的原点是程序的左上⾓
lbl1 = QLabel('Zetcode', self)
#这个元素的左上⾓就在从这个程序的左上⾓开始的(15, 10)的位置
lbl2 = QLabel ('tutorials', self)
lbl3 = QLabel('for programmers', self)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Absolute')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
<_())
布局类简介
常⽤的布局类如下:
⽔平布局管理器(QHBoxLayout)可以把添加的控件以⽔平的顺序依次排开;
垂直布局管理器(QVBoxLayout)可以把添加的控件以垂直的顺序依次排开;
⽹格布局管理器(QGridLayout)可以以⽹格的形式把添加的控件以⼀定矩阵排列;
窗体布局管理器(QFormLayout)可以以两列的形式排列所添加的控件。
使⽤布局管理器的优点是,组件的布局根据⽤户设置和系统⾃⾏布局确定位置和尺⼨,布局⽅式灵活,且组件的尺⼨可以根据情况发⽣恰当的改变,布局美观。
布局类进阶
1.⽔平(垂直)布局管理器[QHBoxLayout(QVBoxLayout)]
QHBoxLayout:按照从左到右的顺序添加控件。
QVBoxLayout:按照从上到下的顺序添加控件。
QHBoxLayout 和 QVBoxLayout 的⽤法基本相同。这⾥以⽔平布局管理器(QHBoxLayout)为例来进⾏说明。
QHBoxLayout 类中的常⽤⽅法如下:
addLayout(self, QLayout, stretch=0):在窗⼝的右边添加布局,使⽤ stretch 进⾏伸缩,默认伸缩量为 0;
addWidget(self, QWidget, stretch, Qt.Alignment alignment):在布局中添加控件,其中 stretch 只适⽤于 QBoxLayout,控件和窗⼝会随着伸缩量的变⼤⽽增⼤;alignment ⽤于指定对齐⽅式;
addSpacing(self, int):设置各控件的上下间距。通过该⽅法可以增加额外的空间。
【例 2】实现⽔平布局。具体代码如下:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
class Exp(QWidget):
def __init__(self):
super().__init__()
seif.initUI()
def initUI(self):
okbuttcn = QPushButton('OK')
cancelbutton = QPushButton('Cancel')
hbox = QHBoxLayout()
hbox.addStretch()
hbox.addWidget(okbutton)
hbox.addWidget(cancelbutton)
vbox = QVBoxLmyout()
vbox.addStretch()
vbox.addLayout(hbox)
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 200)
seif.setWindowTitle('Layout Management')
self.show()
if __name__ == '__main__' :
app = QApplication(sys.argv)
ex = Exp()
<_())
2.⽹格布局管理器(QGridLayout)
QGridLayout 将窗⼝分隔成⾏和列的⽹格来进⾏排列。通常可以使⽤ addWidget( ) 函数将被管理的控件(Widget)添加到窗⼝中,或者使⽤ addLayout( ) 函数将布局(Layout)添加到窗⼝中。也可以使⽤ addWidget( ) 函数对所添加的控件设置⾏数和列数的跨越,最终实现⽹格占据多个窗格。
QGridLayout 类中的常⽤⽅法如下:
1) addWidget(QWidget widget, int row, int column, int alignment=0):给⽹格布局添加控件,设置指定的⾏和列。起始位置的默认值为 (0,0)。其中,widget 表⽰所添加的控件;row 表⽰控件的⾏数,默认从 0 开始;column 表⽰控件的列数,默认从 0 开始;alignment 表⽰对齐⽅式。
2) addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt.Alignment alignment=0):当所添加的控件跨越很多⾏或列时,使⽤这个函数。其中,widget 表⽰所添加的控件,fromRow 表⽰控件的起始⾏数,fromColumn 表⽰控件的起始列数,rowSpan 表⽰控件跨越的⾏数,columnSpan 表⽰控件跨越的列数,alignment 表⽰对齐⽅式。该⽅法⽤于设置控件在⽔平和垂直⽅向的间隔。
【例 3】实现⽹格布局。具体代码如下:
import sys
from PyQt5.QtWidgets import(QApplication, QWidget, QPushButton, QGridLayout)
class Example(QWidget):
def __init__(self):
super() .__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
self.setLayout(grid)
names =[' '(', ')', '%', 'c',
'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.setWindowTitle('计算器' ) self.show()
if __name__ == '__main__': app = QApplication(sys.argv) ex = Example()
<_())
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论