PyQt5:布局_weixin_33840661的博客-程序员宅基地

技术标签: c/c++  

  在一个GUI程序里,布局是非常重要的。布局的作用是管理应用中的控件在窗体上的摆放位置,以及控件本身的大小尺寸。PyQt5支持三种布局:绝对布局、盒布局、网格布局。

1、绝对布局

  在窗口上是以像素单位设置尺寸和位置的,所以可以用绝对定位的方式确定控件的尺寸,以及控件在窗口上的位置。本例中,窗口放置三个QLabel控件,并通过绝对布局让这三个QLabel控件在不同的位置显示。实例如下:

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class AbsoluteLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        lbl1 = PQW.QLabel('姓名', self)
        lbl1.move(15, 10)
        lbl2 = PQW.QLabel('年龄', self)
        lbl2.move(35, 40)
        lbl3 = PQW.QLabel('城市', self)
        lbl3.move(55, 70)
        self.setGeometry(300,300,250,150)
        self.setWindowTitle('绝对布局')
        self.show()

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

  绝对布局的特点:

  (1)控件的位置固定,不会随着窗口尺寸的变化而变化。例如,当窗口默认尺寸控件在窗口中心时,如果窗口的尺寸改变,那么这个控件将不再处于窗口中心。

  (2)无法使用不同平台和不同分辨率的显示器。

  (3)更改字体大小可能会破坏布局

  (4)如果决定对应用进行重构,那么还需要重新计算每一个控件的位置和大小。

  因此,绝对布局尽管非常灵活,但并不能适应所有的情况,如果要让布局适应性更强,可以使用盒布局或网格布局。

2、盒布局

  使用盒布局能够让程序具有更强的适应性。盒布局分为水平盒布局和垂直盒布局,分别用QHBoxLayout类 和 QVBoxLayout类 表示。水平盒布局是将控件沿着水平方向摆放,垂直盒布局是将控件沿着垂直方向摆放。

  方法:如果要对控件使用盒布局,需要通过盒布局对象的addWidget方法将控件添加到盒布局中,如果要将一个布局添加到盒布局中作为子布局存在,需要通过盒布局对象的addLayout方法将布局对象添加到盒布局中。

(1)实现布局——右下角:

 实现代码:

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("确定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        vbox = PQW.QVBoxLayout()
        vbox.addStretch()
        vbox.addLayout(hbox)
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle('盒布局')
        self.show()

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

(2)实现布局——左下角:

 

实现代码:


import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class
BoxLayout(PQW.QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): okButton = PQW.QPushButton("确定") cancelButton = PQW.QPushButton("取消") hbox = PQW.QHBoxLayout() # hbox.addStretch() hbox.addWidget(okButton) hbox.addWidget(cancelButton) hbox.addStretch() #调整位置到此处 vbox = PQW.QVBoxLayout() vbox.addStretch() vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300,300,300,250) self.setWindowTitle('盒布局') self.show() if __name__ == '__main__': app = PQW.QApplication(sys.argv) ex = BoxLayout() sys.exit(app.exec_())

(3)实现布局——右上角:

 

实现代码:

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("确定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        vbox = PQW.QVBoxLayout()
        # vbox.addStretch()
        vbox.addLayout(hbox)
        vbox.addStretch()
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle('盒布局')
        self.show()

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

(4)实现布局——左上角:

 

实现代码: 

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("确定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        # hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        hbox.addStretch()               # 调整到这里
        vbox = PQW.QVBoxLayout()
        # vbox.addStretch()
        vbox.addLayout(hbox)
        vbox.addStretch()              # 调整到这里
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle('盒布局')
        self.show()

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

3、网格布局

  网格布局相当于一个二维表,将窗口划分为若干行若干列。一个控件可以摆放在一个单元格中,也可以横跨多行多列。网格布局用QGridLayout类表示。该类中常用的方法是addWidget,可以将一个控件添加到网格布局中,并指定该控件从第几行第几列开始,以及占用几行几列。还可以使用addSpacing方法指定在水平和垂直方向上单元格之间的距离。本例中,使用网格布局创建了一个提交数据的表单窗口,包含了三个QLabel控件和三个文本编辑框(2个QLineEdit控件 和 1个QTextEdit控件)。

布局如下:

实现代码:

 

import sys
import PyQt5.QtWidgets as PQW

class FormGridLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        title = PQW.QLabel('标题')
        author = PQW.QLabel('作者')
        summary = PQW.QLabel('摘要')
        titleEdit = PQW.QLineEdit()
        authorEdit = PQW.QLineEdit()
        summaryEdit = PQW.QTextEdit()
        # 创建一个网格布局对象
        grid = PQW.QGridLayout()
        # 设置单元格之间的距离
        grid.setSpacing(10)

        # 向网格布局添加title控件,位于第2行第1列
        grid.addWidget(title,1,0)
        # 向网格布局添加titleEdit控件,位于第2行第2列
        grid.addWidget(titleEdit,1,1)

        # 向网格布局添加author控件,位于第3行第1列
        grid.addWidget(author, 2, 0)
        # 向网格布局添加authorEdit控件,位于第3行第2列
        grid.addWidget(authorEdit, 2, 1)

        # 向网格布局添加summary控件,位于第4行第1列
        grid.addWidget(summary, 3, 0)
        # 向网格布局添加summaryEdit控件,位于第4行第2列,并占用了5行1列
        grid.addWidget(summaryEdit, 3,1,5,1)

        #将网格布局应用于当前窗口
        self.setLayout(grid)

        self.setGeometry(300,300,350,300)
        self.setWindowTitle('网格布局')
        self.show()

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

 

转载于:https://www.cnblogs.com/chenhaiming/p/9928399.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33840661/article/details/93226323

智能推荐

史上最全的Java从入门到精通,播放最多的Java视频教程_ZZZAILE的博客-程序员宅基地

“Java Planform Standard Edition”是Java语言的标准平台技术,是所有Java开发的语言基础,更是大数据、分布式开发思想建模的初期,此阶段的Java语义、语法,会充斥在大型企业级架构中的各个环节,是Java开发的核心内容。怎么学JavaJava是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。JavaSE编程基础DOS常用命令 安装JDK、设置环境变..

IEEE 802.11 Frame Types_道al的博客-程序员宅基地

IEEE 802.11 Frame TypeszhuaIEEE 802.11 Frame TypesIEEE 802.11 in the OSI Reference ModelThe IEEE 802.11 architecture resides in the Data Link Media Access Control (MAC) sublayer an

一台电脑安装两个不同版本jdk,实现不同版本切换_Roger_CoderLife的博客-程序员宅基地

在实际开发中,可能会碰到不同项目需要利用不同jdk版本进行开发,这时候就需要我们安装不同jdk版本,实现不同项目进行jdk切换了。首先,可根据需求下载不同jdk版本,这地方我安装了jdk1.6(32位),jdk1.7jdk1.8,关于jdk可自行去官网下载安装。安装好后配置好相关环境变量,这里我们不再多加赘述。安装好后我们只需要更改java_home的配置,如下图。为了方便,此...

redis学习笔记(1):redis基础_polo_longsan的博客-程序员宅基地

redis是一个远程内存数据库,共有5中数据类型:STRING(字符串),LIST(列表),SET(集合),HASH(散列),ZSET(有序集合)。5中数据类型的基本操作:1、字符串redis 127.0.0.1:6379> set hello worldOKredis 127.0.0.1:6379> get helo(nil)redis 127.0.0.1:6379> get h

nvm node -v 拒绝访问_最凶残的小海豹的博客-程序员宅基地_node拒绝访问

安装nvm的时候,路径选择了 C:\nvm 和 C:\node 。安装成功后,控制台执行 nvm install 12.12.0 安装node,安装完成后,打开新的控制台,输入 node -v 检测node是否安装成功。结果弹出 “此应用无法在你的电脑上运行” 的提示框,点击确定后,控制台显示拒绝访问。原因:应该是因为C盘权限问题导致。解决方法:卸载nvm,重新安装nvm,将路径选择成 D:\nvm 和 D:\node 就可以了。...

ganglia配置_JackLi_csdn的博客-程序员宅基地

1、安装 httpd 服务与 php sudo yum -y install httpd php2、安装其他依赖 sudo yum -y install rrdtool perl-rrdtool rrdtool-devel sudo yum -y install apr-devel3、安装gangliasudo rpm -Uvh http://dl.fedoraproject.or...

随便推点

海伦公式的证明——杨子曰数学_杨子曰的博客-程序员宅基地

海伦公式的证明S△ABC=12absincS△ABC=12absin⁡cS_{△ABC}=\frac{1}{2}ab \sin c S△ABC=12ab1−cos2c−−−−−−−−√S△ABC=12ab1−cos2⁡cS_{△ABC}=\frac{1}{2}ab\sqrt{1-\cos^2 c} S△ABC=12ab1−(a2+b2−c2)24a2b2−−−−−−−−−−−−−−−√S...

python opencv 读取图片 返回图片某像素点的b,g,r值_hlgwx的博客-程序员宅基地

#coding=utf-8#读取图片 返回图片某像素点的b,g,r值import cv2import numpy as npimg=cv2.imread('./o.jpg')px=img[10,10]print pxblue=img[10,10,0]print bluegreen=img[10,10,1]print bluered=img[10,10,2]print bl...

java中foreach循环的注意事项_insping的博客-程序员宅基地

简单的ArrayList小例子: List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); for (Integer integer : list) { System.out.println(inte

java输入数字_在java中,如何从键盘中输入数字,字符,字符串_kBlnW的博客-程序员宅基地

java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象。常用的类有BufferedReader,Scanner。实例程序:一,利用 Scanner 实现从键盘读入integer或float 型数据Java代码importjava.util.*;publicclasstest{publicstaticvoidmain(Stringargs[]){Scann...

程序员丰富的感情生活_苏绪的博客-程序员宅基地_程序员的感情生活

今天是七夕,分享一些爱情的小故事,作为程序员,也要把生活过的有滋有味才行,并非他人想的那样,只会敲键盘,我们同样憧憬美好的爱情,追求技术卓越也需要身边爱情的滋润,社会现实虽然残酷,但是依然要对美好生活以及美好爱情寄予希望,不然我们的生活还有何意义呢?在此,祝愿有情人终成眷属!为开启不一样的程序人生而努力!小微号:EnchantedDamon简单的爱情那就简单化吧!...

信息安全——ELGamal数字签名方案的实现_lishuhuakai的博客-程序员宅基地

ELGamal数字签名方案的实现1. 问题描述为简化问题,我们取p=19,g=2,私钥x=9,则公钥y=29 mod 19=18。消息m的ELGamal签名为(r,s),其中r=gk mod p,s=(h(m)-xr)k-1 mod (p-1)2.基本要求   考虑p取大素数的情况。3. 实现提示①     模n求逆a-1modn运算。②     模n的大数幂乘运算

推荐文章

热门文章

相关标签