IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> PyQt5学习笔记(3) 布局 -> 正文阅读

[Python知识库]PyQt5学习笔记(3) 布局

绝对布局

每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性:

  1. 元素不会随着我们更改窗口的位置和大小而变化。
  2. 不能适用于不同的平台和不同分辨率的显示器
  3. 更改应用字体大小会破坏布局
  4. 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小
import sys
from PyQt5.QtWidgets import QWidget,QLabel,QApplication

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        lb1 =QLabel('ZHM',self)
        lb1.move(15,15)

        lb2 = QLabel('XYX',self)
        lb2.move(35,35)

        lb3 =QLabel('Love Forever',self)
        lb3.move(55,55)

        self.setGeometry(300,300,250,250)
        self.setWindowTitle('Absolute layout')
        self.show()
if __name__=='__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

说明:

  1. QLabel()创建布局标签

效果:
在这里插入图片描述

盒布局

使用盒布局能让程序具有更强的适应性。这个才是布局一个应用的更合适的方式。QHBoxLayout和QVBoxLayout是基本的布局类,分别是水平布局和垂直布局

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


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okbutton = QPushButton('OK',self)
        cancelbutton =QPushButton('CANCEL',self)

        hbox = QHBoxLayout()
        hbox.addStretch(1) #增加弹性
        hbox.addWidget(okbutton)
        hbox.addWidget(cancelbutton)

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

        self.setLayout(vbox)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Buttons')    
        self.show()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

说明:

  1. hbox = QHBoxLayout() 创建hbox对象
  2. hbox.addStretch(1) 增加弹性空间,就是在两个控件间增加弹性。
  3. 添加控件到hbox,他会将按钮都挤到窗口右边
  4. vbox.addLayout(hbox) 把水平布局放到垂直布局里

效果:
在这里插入图片描述

栅格布局

将窗口分为行和列

import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout, 
    QPushButton, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):

        grid = QGridLayout()
        self.setLayout(grid)

        names = ['X', 'Y', '', 'X',
                 'I', 'LOVE', 'YOU', 'AND',
                'I', 'WILL', 'MARRY', 'YOU',
                 '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('GRID')
        self.show()


if __name__ == '__main__':

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

说明:

  1. grid = QGridLayout() 创建栅格布局对象
  2. self.setLayout(grid) 窗口布局设置为栅格布局
  3. names为按钮内容
  4. positions为按钮位置,栅格位置
  5. zip函数将positions和names一一对应,组成元组。*为解运算符
  6. grid.addWidget(button, *position)将控件添加到(row,col)

效果:
在这里插入图片描述

栅格布局跨行跨列

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

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        XYX = QLabel('Xyx')
        LOVES =QLabel('Loves')
        ZHM = QLabel('ZHM')

        LOVESe = QTextEdit()
        XYXe = QLineEdit()
        ZHMe = QLineEdit()

        grid = QGridLayout()
        grid.setSpacing(10) #设置行距

        grid.addWidget(XYX,1,0)
        grid.addWidget(XYXe,1,1)

        grid.addWidget(LOVES,2,0)
        grid.addWidget(LOVESe,2,1,5,1) #跨5行1列

        grid.addWidget(ZHM,8,0)
        grid.addWidget(ZHMe,8,1)

        self.setLayout(grid)

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


if __name__ == '__main__':

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

说明

  1. grid.setSpacing(10) 为各元素的行距
  2. grid.addWidget(LOVESe,2,1,5,1)从2行1列,跨到7行1列

效果:
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章           查看所有文章
加:2022-05-03 09:23:35  更:2022-05-03 09:23:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:59:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码