第一节的学习笔记被吐槽了…,做人还是要低调,不要标题党啊…。
这次给大家带来的是PyQT5 QWidget类中窗口创建、大小设置及内容边距的相关API及用法。
这一部分内容好像在网页前端设计课程里老师提的比较多,但是在PyQt5里面好像讲的不是特别多。
笔记原文如下:
QWidget 和QObject不同,它是我们真正开始学习的第一控件(可以被用户看到的控件)。
创建方法:
window = QWidget()
Qwidget()中可填入参数:"(self, parent=None, flags)"
parent :父类,设置窗口父类对象,不设置为None,为顶层窗口;
flags:窗口标志。
窗口标志一览:
项目 | 说明 |
---|---|
Qt.MSWindowsFixedSizeDialogHint | 窗口无法调整大小 |
Qt.FramelessWindowHint | 窗口无边框 |
Qt.CustomizeWindowHint | 有边框但无标题栏和按钮,不能移动和拖动 |
Qt.WindowTitleHint | 添加标题栏和一个关闭按钮 |
Qt.WindowSystemMenuHint | 添加系统目录和一个关闭按钮 |
Qt.WindowMaximizeButtonHint | 激活最大化和关闭按钮,禁止最小化按钮 |
Qt.WindowMinimizeButtonHint | 激活最小化和关闭按钮,禁止最大化按钮 |
Qt.WindowMinMaxButtonsHint | 激活最小化,最大化和关闭按钮 |
Qt.WindowCloseButtonHint | 添加一个关闭按钮 |
Qt.WindowContextHelpButtonHint | 添加问号和关闭按钮,同对话框 |
Qt.WindowStaysOnTopHint | 窗口始终处于顶层位置 |
Qt.WindowStaysOnBottomHint | 窗口始终处于底层位置 |
import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget(flags=Qt.MSWindowsFixedSizeDialogHint)
window.show()
sys.exit(app.exec_())
项目 | 说明 |
---|---|
x() | 相对于父控件的x位置 顶层控件(没有父控件)则相对于桌面的x位置 |
y() | 相对于父控件的y位置 顶层控件(没有父控件)则相对于桌面的y位置 |
pos() | x和y的组合 包含窗口框架 QPoint(x, y) |
width() | 控件的宽度,不包含任何窗口框架 |
height() | 控件的高度,不包含任何窗口框架 |
size() | width和height的组合 不包含任何窗口框架 QSize(width, height) |
geometry() | 用户区域相对于父控件的位置和尺寸组合 QRect(x, y, width, height) |
rect() | 0, 0, width, height的组合 QRect(0, 0, width, height) |
frameSize() | 框架大小 |
frameGeometry() | 框架尺寸 |
项目 | 说明 |
---|---|
move(x, y) | 操控的是x, y;也就是pos 包括窗口框架 |
resize(width, height) | 操控的是宽高 不包括窗口框架 |
setGeometry(x_noFrame, y_noFrame, width, height) | 注意,此处参照为用户区域 |
adjustSize() | 根据内容自适应大小 |
setFixedSize() | 设置固定尺寸 |
注意:控件显示完毕之后, 具体的位置或者尺寸数据才会正确。
大部分的PyQT教程讲到窗口大小和位置的时候都会把这张非常经典的图拿出来给大家参考:
大家可以对照着上面的API看看。
这里也用下面的实例来帮助大家理解。
x(),y(),pos() API测试:
window = QWidget()
c_window = QWidget(window)
c_window.setStyleSheet("background-color: blue;")
# 设置窗口大小
window.resize(200,300)
c_window.resize(100,100)
# 移动窗口
window.move(300,300)
c_window.move(50,50)
# 先让窗口显示出来,具体尺寸坐标信息才准确
window.show()
# x(),y(),pos() API测试
print(window.x(),window.y(),window.pos())
print(c_window.x(),c_window.y(),c_window.pos())
# ------运行结果------
# 300 300 PyQt5.QtCore.QPoint(300, 300)
# 50 50 PyQt5.QtCore.QPoint(50, 50)
# ------运行结果------
看图:
width,height,size,frameSize API接口测试:
# width,height,size,frameSize
print(window.width(),window.height(),window.size(),window.frameSize())
print(c_window.width(),c_window.height(),c_window.size(),c_window.frameSize())
# ------运行结果------
# 200 300 PyQt5.QtCore.QSize(200, 300) PyQt5.QtCore.QSize(202, 339)
# 100 100 PyQt5.QtCore.QSize(100, 100) PyQt5.QtCore.QSize(100, 100)
# ------运行结果------
看图:
# 设定窗口固定大小
window.setFixedSize(200,300) # 设置后窗口不能最大化,不能拉大窗口
window.setGeometry(300,300,300,300)
# setGeometry 前两个参数是窗口位置,不包含框架,是用户区域的左上角顶点的坐标
# 后两个参数是窗口的宽和高,窗口大小可以被改变。
window.adjustSize() # 窗口自适应大小,即控件根据自身内容设置的一个大小
要求:
1、创建一个窗口, 设置尺寸为500 x 500, 位置为 300, 300
2、通过给定的的个数, 在该窗口内创建相应个数的子控件
3、 给定一列子控件的个数,让所有子控件在窗口均匀排列
4、假设有50个子控件,一列排4个
代码:
window2 = QWidget()
window2.resize(500, 500)
window2.move(300, 300)
# 先让父窗口显示,这样计算出来的width 和 height才准确
window2.show()
# 总的控件个数
widget_count = 50
# 一行有多少列
column_count = 4
# 计算一个控件的宽度
widget_width = window2.width() / column_count
# 总共有多少行 (编号 // 一行多少列 + 1)
row_count = (widget_count -1) // column_count + 1
# 计算一个控件的高度
widget_height = window2.height() / row_count
# 创建控件,并设置每个控件的位置
for i in range(0, widget_count):
w = QWidget(window2)
# 设置子控件大小
w.resize(widget_width, widget_height)
# 设置子控件坐标
widget_x = i % column_count * widget_width
widget_y = i // column_count * widget_height
w.move(widget_x, widget_y)
# 设定子控件背景颜色及边框颜色
w.setStyleSheet("background-color: red;border: 1px solid yellow;")
# 显示子控件,因父控件已显示(已绘制),如不手动设置子控件显示,将看不到子控件
w.show()
解析:
1、这里注意父窗口的show()方法使用的位置及让每个子控件再调用show()方法的意义。
2、注意子控件需排列的行数计算方法。
效果图:
项目 | 说明 |
---|---|
minimumWidth() | 最小尺寸的宽度 |
minimumHeight() | 最小尺寸的高度 |
minimumSize() | 最小尺寸 |
maximumWidth() | 最大尺寸的宽度 |
maximumHeight() | 最大尺寸的高度 |
maximumSize() | 最大尺寸 |
项目 | 说明 |
---|---|
setMinimumWidth() | 设置窗口最小宽度 |
setMinimumHeight() | 设置窗口最小高度 |
setMinimumSize() | 设置窗口最小尺寸 |
setMaximumWidth() | 设置窗口最大宽度 |
setMaximumHeight() | 设置窗口最大高度 |
setMaximumSize() | 设置窗口最大尺寸 |
window3 = QWidget()
# 设置窗口最小宽度
window3.setMinimumWidth(200)
# 设置窗口最小高度
window3.setMinimumHeight(200)
# 设置窗口最大尺寸
window3.setMaximumSize(800,800)
# 提示设置最大尺寸,但没有设定窗口初始尺寸时,PyQt5 自己会根据最大尺寸给定一个大小
# 设定了最大、最小限定尺寸时,再设置的尺寸将不能超过限定值
window3.resize(900,900)
window3.resize(150,150)
window3.show()
注意:设定了最大、最小限定尺寸时,再通过resize()方法设置的尺寸将不能超过限定值。
项目 | 说明 |
---|---|
setContentsMargins(左, 上, 右, 下) | 设置内容边距 |
getContentsMargins() | 获取内容边距 |
contentsRect() | 获取内容区域 |
window4 = QWidget()
window4.resize(500,500)
# 创建label控件
label = QLabel(window4)
label.setText('这是一个标签!')
label.resize(300,300)
label.setStyleSheet("background-color : green")
label.move(50,50)
# 获取内容区域
print(label.contentsRect())
# ------运行结果------
# PyQt5.QtCore.QRect(0, 0, 300, 300)
# ------运行结果------
window4.show()
解析:
这里我们创建了一个500,500的窗口,窗口内部有一个大小为300,300的label标签,标签内文字内容为:这是一个标签!。
我们打印了label控件的内容区域,请看图理解:
当我们对label控件的内容边距做出设定时,如下面的代码:
# 设置内容边距,及获取内容边距
label.setContentsMargins(100,0,0,0)
print(label.getContentsMargins())
# 获取内容区域
print(label.contentsRect())
# ------运行结果------
# (100, 0, 0, 0)
# PyQt5.QtCore.QRect(100, 0, 200, 300)
# ------运行结果------
window4.show()
上面的代码设置了 内容边距为(100,0,0,0):
注意下图内容区域值,及文字的显示的位置。
文字还是默认显示在内容区域的水平靠左垂直居中,因为内容区域的变化,所以文字位置才发生了变化!
本小节的内容到此就结束了。在PyQT5的使用中,QWidget的使用非常频繁。它的API和用法的内容也特别多,可能还要分一两个小节才能把和它有关的知识梳理完吧。
整理不易,希望大家点个赞,收藏一个再走吧。
想要笔记原文的,可留意或私信。