本节研究布局管理的内容。

(一)绝对对位 

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',
'', '', '', '/',
'', '', '', '*',
'', '', '', '-',
'', '.', '=', '+']
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_())

Python pyQt4/PyQt5 学习笔记3(绝对对位,盒布局,网格布局)的更多相关文章

  1. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  2. Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)

    例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...

  3. Python pyQt4/PyQt5 学习笔记4(事件和信号)

    信号 & 槽 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QWidget,QLCDNumber,QS ...

  4. 【PyQt5 学习记录】002:添加部件及网格布局

    #!/usr/bin/python3 # -*- coding:utf-8 -*- import sys from PySide2.QtWidgets import (QApplication, QW ...

  5. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  6. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  7. PyQt5学习笔记-从主窗体打开一个子窗体

    PyQt5学习笔记-从主窗体打开一个子窗体 软件环境: Eric6+Python3.5+PyQt5 试验目标: 1.点击菜单项Open,打开一个子窗体 2.点击按钮Open,打开一个子窗体 主窗体设计 ...

  8. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  9. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

随机推荐

  1. 前端Table数据导出Excel使用HSSFWorkbook(Java)

    一.实现原理: 1. 前端查询列表数据并渲染至table(<table>...</table>)表格 2. 表格html代码传输至后台 3. 后台把html转成Excel输出流 ...

  2. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

  3. Linux 查看系统硬件信息

    linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...

  4. DWZ主从表界面唯一性验证(后台验证)(三)

    之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断. 再次介绍一下背景需求: 利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件 1.是 ...

  5. android手机内的通讯录数据库

    今天看了一下 android手机内的通讯录数据库,简单的汇总了一下. 数据库见附件中的contacts2.db , 里面一共有40个表,34个视图,很庞大,挑几个重点的看一下. 1.表Raw_cont ...

  6. TV和BTV(全变分和双边全变分)

    TV:Total Variation BTV:Bilateral Total Variation Osher等在1992 年提出了总变分(TV)超分辨率重建方法,该方法能够有效地去除噪声和消除模糊,但 ...

  7. phpcms v9不限模型全站搜索

    简单修改一下v9默认的搜索功能,可以不按模型搜索全站内容 下面是被修改后的search模块中的index.php文件 <?php defined('IN_PHPCMS') or exit('No ...

  8. mysql中floor函数的作用是什么?

    需求描述: 最近写mysql程序的时候,使用了floor函数,在此记录下该函数的作用 操作过程: 1.使用floor函数的测试 mysql> select floor(1.23),floor(- ...

  9. xcode修改默认头部注释(__MyCompanyName__) (转)

    打开命令行: defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{ "ORGANIZATIONNAME&qu ...

  10. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...