Python pyQt4/PyQt5 学习笔记3(绝对对位,盒布局,网格布局)
本节研究布局管理的内容。
(一)绝对对位
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(绝对对位,盒布局,网格布局)的更多相关文章
- Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)
PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...
- Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)
例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...
- Python pyQt4/PyQt5 学习笔记4(事件和信号)
信号 & 槽 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QWidget,QLCDNumber,QS ...
- 【PyQt5 学习记录】002:添加部件及网格布局
#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys from PySide2.QtWidgets import (QApplication, QW ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- PyQt5学习笔记-从主窗体打开一个子窗体
PyQt5学习笔记-从主窗体打开一个子窗体 软件环境: Eric6+Python3.5+PyQt5 试验目标: 1.点击菜单项Open,打开一个子窗体 2.点击按钮Open,打开一个子窗体 主窗体设计 ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
随机推荐
- llinux 环境安装编译 nginx (源码安装包)
简介: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国 ...
- memcached系列之二
存储命令 1.set命令 语法: set key flags exptime bytes [noreply] value 参数说明: key: flags: exptime: bytes: norep ...
- Business vs Technology
Business 只是 Technology的子集. Business只是体现在Code中. 比如说是HTML页面中内容的一部分. 或者说业务是对HTML组成的内容的分类. 比如说Smallbusin ...
- Oracle11g select查询时候输出未选定行
解决方法是: 查询的表名是否是大写的: 是否没有提交执行结果:可以commit一下:
- APK防反编译技术
APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包括有一个classes.dex.我们编译后生成的程序代码就所有在那里了, 通过apktool等工具能够轻松地将它们反 ...
- web_submit_data详解
定义:处理无状态或者上下文无关的表单提交.它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的,发送这些请求时不需要表单上下文. 函数形式:web_submit_data( ...
- vue-router2路由参数注意问题
1.vue 路由 如果传递 params 定义路由的时候是 /路由名称:id 获取的时候 this.$route.params.id 最后形如 /路由名称/路由参数 传参的时候 params:{ st ...
- Alpine Linux:如何配置GUI的图形桌面环境:x Desktop Environment
alpine linux 真是不错.小巧.迅捷! 官方的各个版本的alpine镜像内没有带图形环境的.那我们如何构建自己的桌面图形环境呢? 其实:这个问题,在起官网的wiki内有指南,我们根据那些相关 ...
- [Scikit-learn] 2.5 Dimensionality reduction - ICA
理论学习: 独立成分分析ICA历史 Ref: Lecture 15 | Machine Learning (Stanford) - NG From: https://wenku.baidu.com/v ...
- Spring @Lazy
@DependsOn用于强制初始化其他Bean.可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean. @DependsOn ...