✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
qwidget
基础窗口控件qwidget类是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自qwidget类。
窗口控件(widget,简称“控件”)是在pyqt中建立界面的主要元素。在pyqt中把没有嵌入到其他控件中的控件称为窗口,一般窗口都有边框、标题栏。
窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等;控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。
一个程序可以有多个窗口,一个窗口也可以有多个控件。
qwidget思维导图描述如下:
1.子控件受父控件裁切
# 0. 导入需要的包和模块
from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("qwidget体验")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)
#验证控件受父控件裁切
red = qwidget(window)
red.resize(100,100)
red.move(450,0)
red.setstylesheet("background-color:red;")
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
运行,可以看到红色的子控件超过父控件范围的部分被父控件裁剪,没显示出来
2.控件按z轴顺序排序
演示每个控件都是按z轴顺序排序,代码写在下面的会把上面的遮挡
# 0. 导入需要的包和模块
from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("qwidget体验")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)
red = qwidget(window)
red.resize(100,100)
red.move(300,0)
red.setstylesheet("background-color:red;")
#验证每个空间都是按z轴顺序排序,代码写在下面的会把上面的遮挡
green = qwidget(window)
green.resize(100,100)
green.move(300,50)
green.setstylesheet("background-color:green;")
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
运行,可见绿色将红色部分遮挡
查看qwidget直接父类
print("qwidget父类",qwidget.__bases__)
类名.mro()不仅能找出直接父类,还能找出间接父类
#mro 针对super作用:专门用于解决复杂的多继承调用顺序关系;依照mro返回的列表顺序,依次调用;
print(“使用super,qwidget父类调用顺序”,qwidget.mro())
3.控件的位置和大小
(1)api介绍
获取:
框架尺寸与控件尺寸差异对比
(2)尺寸获取实战
# 0. 导入需要的包和模块
from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("qwidget尺寸")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)
window.move(300,200)
#获取尺寸
print("获取控件的x坐标",window.x())
print("获取控件的y坐标",window.y())
print("获取控件的pos",window.pos())
print("获取控件的宽度",window.width())
print("获取控件的高度",window.height())
print("获取控件的size",window.size())
print("获取控件的geometry",window.geometry())
print("获取控件的rect",window.rect())
#获取框架尺寸
print("获取框架的大小",window.framesize())
print("获取框架的geometry",window.framegeometry())
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
由于上述获取框架的方式是在控件show之前获取的,所以是错误的,要在控件显示完毕后再获取,才是正确的
此时获取的框架尺寸才是正确的
(3)尺寸设置
api介绍
设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
#设置的是用户区域的宽和高
window.resize(300, 300)
#移动控件
window.move(300,200)
通过setgeometry设置 setgeometry(x_noframe, y_noframe, width, height)
#设置的是用户区域的位置以及宽和高,不包含标题栏。要在show之后设置
window.setgeometry(0,0,500,500)
展示看不到标题栏
adjustsize根据内容自适应大小
# 0. 导入需要的包和模块
from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("qwidget尺寸设置")
#添加个标签
label = qlabel(window)
label.settext("景天")
label.move(200,100)
label.setstylesheet("background-color:cyan;")
#设置槽函数
def changecontent():
newcontent = label.text()+"景天"
label.settext(newcontent)
#添加个按钮
#实现点击按钮,标签内容复制一份
btn = qpushbutton(window)
btn.settext("增加内容")
btn.move(200,200)
btn.clicked.connect(changecontent)
# 2.3 展示控件
window.show()
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
#设置的是用户区域的宽和高
# window.resize(300, 300)
#移动控件
# window.move(300,200)
#adjustsize根据内容自适应大小
# window.adjustsize()
#setfixedsize(w,h)设置固定尺寸
# window.setfixedsize(200,300)
#通过setgeometry设置 setgeometry(x_noframe, y_noframe, width, height)
#设置的是用户区域的位置以及宽和高,要在show之后设置
# window.setgeometry(0,0,500,500)
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
这样写,我们点击按钮,标签内容有增加,但是由于标签尺寸没有变化,导致后面的内容没显示出来
我们稍作调整
#设置槽函数
def changecontent():
newcontent = label.text()+"景天"
label.settext(newcontent)
#设置标签尺寸自适应变化
label.adjustsize()
可以看到,点击按钮,标签内容随之变化
setfixedsize(w,h)设置固定尺寸
#设置固定尺寸后,窗口大小不能被拖拽改变大小
window.setfixedsize(200,300)
(4)尺寸设置实战案例
通过给定的的个数, 你负责在一个窗口内创建相应个数的子控件
要求:按照九宫格的布局进行摆放 1行3列
计算公式推导如图所示
import sys
from pyqt5.qt import *
app = qapplication(sys.argv)
window = qwidget()
# 总的控件个数
widget_count = 100
# 一行有多少列
column_count = 3
# 计算一个控件的宽度,最新版本必须取整数
#值为父控件宽度除以多少列
widget_width = int(window.width() / column_count)
# 总共有多少行 (编号 // 一行多少列 + 1)
#编号为总个数减1
row_count = int((widget_count - 1) // column_count + 1)
#每行的高度,总高度除以总行数
widget_height = int(window.height() / row_count)
#循环显示所有子控件
for i in range(0, widget_count):
#新创建的控件都是window的子控件
w = qwidget(window)
w.resize(widget_width, widget_height)
#设置控件的位置,x位置为控件编号与总列数取余,乘以每个控件宽度
widget_x = int(i % column_count * widget_width)
#y位置为控件编号与总列数地板除,乘以每个控件高度
widget_y = int(i // column_count * widget_height)
w.move(widget_x, widget_y)
w.setstylesheet("background-color: red;border: 1px solid yellow;")
#设置父控件
#自适应尺寸
window.adjustsize()
window.move(300, 300)
window.show()
sys.exit(app.exec_())
运行如下
改变下控件个数和每行列数
运行如下
(5)尺寸限定
api介绍
# 0. 导入需要的包和模块
from pyqt5.qt import *
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
window.setwindowtitle("最小尺寸最大尺寸限定")
# window.resize(500, 500)
#固定尺寸,不能拖拽修改大小
# window.setfixedsize(500, 500)
#设置最小尺寸限制,不能拖拽小于最小尺寸
window.setminimumsize(200, 200)
#设置最大尺寸限制,不能拖拽大于最大尺寸
window.setmaximumsize(500, 500)
#可以单独设置最大最小宽度和高度
# window.setminimumwidth(500)
# window.setmaximumwidth(800)
#设置了最大尺寸和最小尺寸,再次修改也不生效
window.resize(1000, 1000)
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec())
可拖拽,但是不能超过最大尺寸和最小尺寸
4.内容边距
api介绍
内容区域默认是水平靠左,垂直居中的位置
内容区域是控件大小减去内容边距后的所剩的位置
# 0. 导入需要的包和模块
from pyqt5.qt import *
import sys
# 1. 创建一个应用程序对象
app = qapplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = qwidget()
# 2.2 设置控件
window.setwindowtitle("内容边距的设定")
window.resize(500, 500)
label = qlabel(window)
label.settext("社会我景天哥, 人狠话不多")
label.resize(300, 300)
label.setstylesheet("background-color: cyan;")
#设置内容边距setcontentsmargins(左, 上, 右, 下),默认内容边距都是0
label.setcontentsmargins(100, 200, 0, 0)
print(label.getcontentsmargins())
#获取内容区域,默认内容区域是水平靠左,垂直居中
print(label.contentsrect())
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
可以设置内容边距,查看内容边距和内容区域
发表评论