python控件布局常用方法_GUI常用的2种布局方式

本文介绍了Python GUI开发中的两种布局管理方式:绝对位置布局和布局类,包括QHBoxLayout、QVBoxLayout、QGridLayout。绝对布局通过setGeometry()等函数设定组件位置,而布局类如QGridLayout能灵活地按网格排列控件,实现响应式布局。
摘要由CSDN通过智能技术生成

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)的位置

lbl1.move(15, 10)

lbl2 = QLabel ('tutorials', self)

lbl2.move(35, 40)

lbl3 = QLabel('for programmers', self)

Ibl3.movq(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_())

布局类简介

常用的布局类如下:

水平布局管理器(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()

sys.exit(app.exec_())

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.move(300, 150)

self.setWindowTitle('计算器' )

self.show()

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = Example()

sys.exit(app.exec_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值