您的位置:首页 > 编程语言 > Python开发

Python pyQt4/PyQt5 学习笔记3(绝对对位,盒布局,网格布局)

2018-01-09 22:30 645 查看
本节研究布局管理的内容。

(一)绝对对位

import sys
from PyQt4 import QtGui

class Example(QtGui.QWidget):

def __init__(self):
super(Example, self).__init__()

self.initUI()

def initUI(self):

lbl1 = QtGui.QLabel('ZetCode', self)
lbl1.move(15, 10)

lbl2 = QtGui.QLabel('tutorials', self)
lbl2.move(35, 40)

lbl3 = QtGui.QLabel('for programmers', self)
lbl3.move(55, 70)

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Absolute')
self.show()

def main():

app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

if __name__ == '__main__':
main()


运行效果:



在这种方式中,编程者指定各种部件的位置和大小。但是当你使用绝对定位时,需要知道有以下的限制:
- 如果我们改变窗口的大小,部件的大小和位置并不会改变。
- 你的应用在不同平台下可能长得不太一样。
- 改变应用中使用的字体可能会扰乱布局。
- 如果我们想改变现有的布局的话,我们必须完全重写布局,这很乏味而且浪费时间。

PyQt5相同功能的例子:(macOS版本)

import sys
from PyQt5.QtWidgets import QWidget,QApplication,QLabel

class Example(QWidget):
def __init__(self):
super(Example,self).__init__()
self.initui()

def initui(self):
lab1=QLabel('blue',self)
lab1.move(15,10)

lab2=QLabel('red',self)
lab2.move(35,40)

lab3=QLabel('green',self)
lab3.move(55,70)

self.setGeometry(300,300,250,150)
self.setWindowTitle('testSample')
self.show()

def main():
app=QApplication(sys.argv)
ex=Example()
sys.exit(app.exec_())

if __name__=='__main__':
main()




(二)盒布局(Box layout)

import sys
from PyQt4 import QtGui

class Example(QtGui.QWidget):

def __init__(self):
super(Example, self).__init__()

self.initUI()

def initUI(self):

okButton = QtGui.QPushButton("OK")
cancelButton = QtGui.QPushButton("Cancel")

hbox = QtGui.QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)

vbox = QtGui.QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)

self.setLayout(vbox)

self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Buttons')
self.show()

def main():

app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

if __name__ == '__main__':
main()


效果如下:



这个例子中我们将两个按钮放在了窗口的右下角。即使我们改变窗口的大小,它们也会在那个地方

相同功能的PyQt5的例子:(macOS例子)

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout,QVBoxLayout

class Exaple(QWidget):
def __init__(self):
super().__init__()
self.initui()

def initui(self):
btn1=QPushButton("OK")
btn2=QPushButton("Cancel")

#QHBoxLayout和QVBoxLayout两个布局类。
#这里我们创建了一个水平箱布局,并且增加了一个拉伸因子和两个按钮。
# 拉伸因子在两个按钮之前增加了一个可伸缩空间。这会将按钮推到窗口的右边。
hbox=QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(btn1)
hbox.addWidget(btn2)

#我们把水平布局放置在垂直布局内。
# 拉伸因子将把包含两个按钮的水平箱布局推到窗口的底边。
vbox=QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox)

self.setGeometry(300,300,300,150)
self.show()

if __name__=='__main__':

app=QApplication(sys.argv)
ex=Exaple()
sys.exit(app.exec_())




(三)网格布局

#网格布局演示,PyQt5,macOS的例子
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QGridLayout,QPushButton

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', '.', '=', '+']
pos=[(i,j) for i in range(5) for j in range(4)]
for p,name in zip(pos,names):
if name=='':
continue
#创建出按钮组件,并使用addWidget()方法向布局中添加按钮。
button=QPushButton(name)
grid.addWidget(button,*p)

self.move(300,150)
self.setWindowTitle('calc')
self.show()

if __name__=='__main__':
app=QApplication(sys.argv)
ex=Example()
sys.exit(app.exec_())




(三)一个网格布局的例子

import sys
from PyQt5.QtWidgets import (QWidget,QLabel,QLineEdit,QTextEdit,QGridLayout,QApplication)

class Exaple(QWidget):
def __init__(self):
super().__init__()
self.initui()

def initui(self):
#包含三个标签,两个单行编辑框和一个文本编辑框组件的窗口。
# 布局使用了QGridLayout布局
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)
#如果我们向网格布局中增加一个组件,我们可以提供组件的跨行和跨列参数。
# 在这个例子中,我们让reviewEdit组件跨了5行。
grid.addWidget(reviewEdit,3,1,5,1)

self.setLayout(grid)

self.setGeometry(300,300,300,300)
self.setWindowTitle('Review')
self.show()

if __name__=='__main__':
app=QApplication(sys.argv)
ex=Exaple()
sys.exit(app.exec_())


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: