一、QWidget简介
QWidget是所有可视控件的基类,他是一个最简单空白控件。而所谓的控件就是用户界面的最小元素,它接收各种相关事件(键盘事件、鼠标事件等)并绘制在屏幕上,展示给用户看。每个控件都是矩形的,它们按照Z轴的顺序排列(垂直与屏幕的方向堆叠起来)。同时,控件受其父控件和前面的控件剪切,也就是说,如果其父控件的尺寸小于其本身,那么控件本身只能显示父控件的大小,而且如果其前面还有控件,那么将会遮挡住它,使其不显示或只显示未被遮挡的部分。没有父控件的控件,称之为窗口,窗口一般会被包裹一层框架,如标题栏等。
QWidget继承自QObject,也就是说所有前面我们学过的QObject的相关API函数QWidegt都可以使用。例如设置对象名、设置属性以及相关信号等等,本章将学习QWidget自身的API及相关信号及事件。
二、QWidget创建、定位及内容边距
API函数 | 参数说明 | 返回值 | 功能作用 |
QWidget(self,parent,flags) | Parent:QWidget Flags: Qt.WindowFlags, QtCore.Qt.WindowType | None | 创建一个QWidget对象 |
当控件没有父对象的时候,就是一个顶层窗口,而参数flags就是设置窗的风格类型的标志,他是一个枚举类,我们将在后面窗口部分进行介绍。
# -*- coding:utf-8 -*-
from PySide6.QtWidgets import QWidget,QApplication
import sys
class window(QWidget):
def __init__(self):
super(window, self).__init__()
# resize()方法设置对象的大小
self.resize(600,600)
# move()方法是移动窗口到指定位置
self.move(300,300)
# 设置窗口标题
self.setWindowTitle("QWidget的创建")
self.My_Ui()
def My_Ui(self):
win2 = QWidget(self)
win2.resize(300,300)
win2.move(100,100)
# setStyleSheet()方法是设置样式表
win2.setStyleSheet("background:red") # 创建控件的样式表
win3 = QWidget(win2)
win3.resize(200, 200)
win3.setStyleSheet("background:green")
if __name__ == '__main__':
app = QApplication(sys.argv)
win = window()
win.show()
sys.exit(app.exec())
运行结果:
1.顶层窗口及内部小部件定位
上面的例子中,我们先设置了win的大小和位置,分别使用了resize()和move()两个方法。它们的参数都是int类型,resize()方法的参数就是控件的长和宽,但是win的move(300,300)和win2的move(100,100)是什么意思呢?他是以什么参照移动的呢?
首先对于win来说,因为其没有父对象,所以他是作为窗口控件的,同时它被Qt默认包裹带有标题栏及最小化和关闭按钮的框架(所有控件作为窗口时都这样),那么它的move(300,300)是以电脑屏幕的左上角为原点(0,0)来向右移动300个px(像素)及向下移动300个px(像素)。而对于win2来说,它是有父对象的,所以他是个白板控件,我们为了容易辨别所以添加了红色的背景色,那么它的move(100,100)就是以其父控件(win)的左上角为原点右移动100个px(像素)及向下移动100个px(像素)。但是这里要说明的是,win作为win2的父控件他是一个窗口,那么它是包含框架的,所以,win的左上角原点(0,0)就需要剔除框架的尺寸的,我们从下图就可以看出。
以下是QWidget位置及尺寸大小相关的基础API:
API函数 | 参数说明 | 返回值 | 功能作用 |
x(self) | None | Int | 获取其相对于父控件或桌面的x坐标(含框架) |
y(self) | None | Int | 获取其相对于父控件或桌面的y坐标(含框架) |
height(self) | None | int | 获取控件高度(不含框架) |
width(self) | None | int | 获取控件宽度(不含框架) |
pos(self) | None | QPiont(x,y) | 获取控件左上角相对于父控件或桌面的点(含框架) |
size(self) | None | QSize(width,height) | 获取控件的尺寸大小(不含框架) |
geometry(self) | None | QRect(x,y,width,height) | 获取用户区域坐标及大小(坐标不含框架,大小不含框架) |
rect(self) | None | QRect(x,y,width,height) | 获取用户区域的矩形范围 |
frameSize(self) | None | QSize(width,height) | 获取控件大小(含框架) |
frameGeometry(self) | None | QRect(x,y,width,height) | 获取控件坐标及大小(坐标含框架,大小含框架) |
Move(self,x,y) | X:int y:int | None | 将控件移动到相对于父控件地点坐标(窗口含框架,非窗口不含) |
resize(self,width,height) | Width:int Height:int | None | 重置控件的尺寸(不含框架) |
setGeometry(self,x,y,width,heiget) | X: int X: int Width:int Height:int | None | 设置控件的用户区几何尺寸(不含框架) |
需要说明的,上述的方法需要区分坐标及大小是否包含框架,同时要注意只有当控件完全显示的时候(QWidgte.show之后),输出数据才会正确,我们通过下面的图形分解及例子来查看他们的区别。
# -*- coding:utf-8 -*-
from PySide6.QtWidgets import QWidget,QApplication
import sys
app = QApplication(sys.argv)
win = QWidget()
win.move(300,300)
win.resize(500,500)
win1 = QWidget(win)
win1.move(100,10)
win1.resize(100,100)
win1.setStyleSheet("background:red")
win.show()
print("win的x坐标为:{0},win1的x坐标为{1}".format(win.x(),win1.x()))
print("win的y坐标为:{0},win1的y坐标为{1}".format(win.y(),win1.y()))
print("win相对于屏幕的左上角坐标(含框架)为:{0},win1相对于win的左上角坐标(含框架)为:{1}".format(win.pos(),win1.pos()))
print("win的宽度为:{0},win1的宽度{1}".format(win.width(),win1.width()))
print("win的高度为:{0},win1的高度为{1}".format(win.height(),win1.height()))
print("win用户区域的大小为(不含框架):{0},win1用户区域的大小为(不含框架):{1}".format(win.size(),win1.size()))
print("win用户区域的左上角坐标及大小为(均不含框架):{0},win1用户区域的左上角坐标及大小为(均不含框架):{1}".format(win.geometry(),win1.geometry()))
print("win用户区域的左上角坐标(相对自身)及大小为(不含框架):{0},win1用户区域的左上角坐标(相对自身)及大小为(不含框架):{1}".format(win.rect(),win1.rect()))
print("win用户区域的大小为(含框架):{0},win1用户区域的大小为(含框架):{1}".format(win.frameSize(),win1.frameSize()))
print("win左上角坐标及大小为(含框架):{0},win1左上角坐标及大小为(含框架):{1}".format(win.frameGeometry(),win1.frameGeometry()))
sys.exit(app.exec())
运行结果:
win的x坐标为:300,win1的x坐标为100
win的y坐标为:300,win1的y坐标为10
win相对于屏幕的左上角坐标(含框架)为:PySide6.QtCore.QPoint(300, 300),win1相对于win的左上角坐标(含框架)为:PySide6.QtCore.QPoint(100, 10)
win的宽度为:500,win1的宽度100
win的高度为:500,win1的高度为100
win用户区域的大小为(不含框架):PySide6.QtCore.QSize(500, 500),win1用户区域的大小为(不含框架):PySide6.QtCore.QSize(100, 100)
win用户区域的左上角坐标及大小为(均不含框架):PySide6.QtCore.QRect(300, 331, 500, 500),win1用户区域的左上角坐标及大小为(均不含框架):PySide6.QtCore.QRect(100, 10, 100, 100)
win用户区域的左上角坐标(相对自身)及大小为(不含框架):PySide6.QtCore.QRect(0, 0, 500, 500),win1用户区域的左上角坐标(相对自身)及大小为(不含框架):PySide6.QtCore.QRect(0, 0, 100, 100)
win用户区域的大小为(含框架):PySide6.QtCore.QSize(500, 531),win1用户区域的大小为(含框架):PySide6.QtCore.QSize(100, 100)
win左上角坐标及大小为(含框架):PySide6.QtCore.QRect(300, 300, 500, 531),win1左上角坐标及大小为(含框架):PySide6.QtCore.QRect(100, 10, 100, 100)
上例测试均为顶层窗口。Pyside6的顶层窗口中,经测试在windows和ios系统x方向均为没有框架宽度。
上图为顶层窗口的相关尺寸示意,而QWidget作为子控件可以看到,其不含标题及框架。同时,它是以父控件的客户区域的左上角即geometry().x()和geometry().y()为原点(0,0)的。所以,其geometry()和framegeometry()是一致的。后续的所有继承子QWidget的控件相对于父控件都是如此。
关于设置控件的样式表setStyleSheet(),Qt称之为qss,类似于css,后面我们会专门章节介绍。这里只需要知道其参数写为“background:red”是将其背景颜色设置为红色。为便于自学,如果想改其他颜色,只需要将red改为其他颜色的英文字母,如yellow、green等。
2.QWidget内容边距的调整
API函数 | 参数说明 | 返回值 | 功能作用 |
setContentsMargins(self, left, top, right, bottom) | left: int, top: int, right: int, bottom: int | None | 设置控件的内容边距 |
getContentsMargins(self) | None | QMargin | 获取控件的内容边距,返回值是一个元祖 |
contentsRect(self) | None | QRect | 获取控件的内容区域,返回值是QRect类型 |
所谓的内容边距就是控件中内容显示的区域(文本、图片等)之外的空白框,而显示区域所呈现的范围就是内容矩形下面的例子就是说明内容边距的含义。
example:由于QWidget主界面无法设置文本图片,所以使用其子类QLabel来测试,QLabel作为QWidget的子类,完全继承QWiget的所有资源。
# -*- coding:utf-8 -*-
from PySide6.QtWidgets import QApplication,QLabel
from PySide6.QtGui import QPixmap
import sys
app = QApplication(sys.argv)
win = QLabel()
win.move(300,300)
win.resize(500,500)
win.setStyleSheet("background:red")
#win.setContentsMargins(100,100,100,100)
print(win.contentsRect())
print(win.contentsMargins())
# 在主面板添加一张图片
win.setPixmap(QPixmap("吹风.gif"))
# 将图片充满整个内容矩形
win.setScaledContents(True)
win.show()
sys.exit(app.exec())
运行结果:
控制台输出结果:
PySide6.QtCore.QRect(0, 0, 500, 500)
<PySide6.QtCore.QMargins(0, 0, 0, 0) at 0x0000019A9E909E40>
可以看到,默认情况下QWidget的内容边距为0(设置内容边距的那行代码备注注释掉了),图片占满了整个显示区域。接下来,我们打开注释再运行:
可以看到,背景颜色是不受内容矩形影响的,对于QRect和QMargin类,将在下一节介绍。
3.QPoint、QSize、QRect及QMargin类
上面我们学习QWidget的方法时,已经接触到了QPoint、QSize、QRect及QMargin类,后面还将持续接触,为了保证后续学习的质量,下面将学习这几个与几何相关的类。
1).QPoint与QPointF的创建及相关方法
QPoint是空间点类,它的常用相关API如下:
API函数 | 参数说明 | 返回值 | 功能作用 |
QPoint(x,y) | x:int y:int | None | 创建一个点对象,参数x,y为点的x和y坐标 |
QPoint() | None | None | 创建一个点对象,等同于QPoint(0,0) |
isNull() | None | bool | 返回点坐标是否为空即(0,0) |
x() | None | Int | 返回一个点X坐标 |
y() | None | Int | 返回一个点Y坐标 |
setX(x) | X:int | None | 设置点的x坐标 |
setY(y) | y:int | None | 设置点的Y坐标 |
toPointF(self) | None | QPointF | 将此单精度点转换为浮点精度的点 |
toTuple(self) | None | tuple(x,y) | 返回一个包含x和y坐标的元组 |
manhattanLength() | None | Int | 返回x () 和y ()的绝对值之和,传统上称为向量从原点到该点的“曼哈顿长度” |
dotProduct(p1,p2) | P1:QPoint P2:QPoint | int | 返回p1和p2的点积。 |
transposed() | None | QPoint | 获取一个交换了x,y坐标的点对象 |
QPoint()的参数x,y坐标坐标均为int类型,如果要构造float类型坐标的点需使用QPointF()。
QPointF的成员方法与QPoint()基本一致,作用也相同,这里就不再列举。只有一个方法需要注意,也是常用的,QPoint转换为QpointF使用的是QPoint.toPointF()方法,而从QpointF.toPoint().
除了在绘图中使用,学习控件的过程中,QPoint和QPointF通常会用在鼠标的点击位置的获取与判断中。
2).QSize与QSizeF的创建及相关方法
QSize用于表示一个对象宽、高的,相关构造函数及API如下:
API函数 | 参数说明 | 返回值 | 功能作用 |
QSize(w,h) | w:int h:int | None | 创建一个尺寸对象,参数w,h为尺寸的宽和高 |
QSize() | None | None | 创建一个尺寸对象,等同于QSize(0,0) |
width() | None | int | 返回尺寸对象的宽数据 |
height() | None | int | 返回尺寸对象的高数据 |
setWidget(w) | W:int | None | 设置尺寸对象的宽数据 |
setHeight(h) | H:int | None | 设置尺寸对象的高数据 |
isNull() | None | bool | 当QPoint对象宽高均为0时,返回True,否则返回Flase |
isValid() | None | bool | 当QPoint对象宽高均大于等于0时,返回True,否则返回Flase |
isEmpty() | None | bool | 当QPoint对象宽高数据有一个小于0时,返回True,否则返回Flase |
scale(w,h,mode) | w:给点宽度 h:给定高度 Mode:缩放模式 | None | 根据指定的模式将尺寸对象大小缩放为具有给定宽度和高度的矩形,缩放模式是一个枚举类,见后附 |
scale(QSize,mode) | QSize:给定尺寸 Mode:缩放模式 | None | 根据指定的模式将尺寸对象大小缩放为具有给定宽度和高度的矩形,缩放模式是一个枚举类,见后附 |
scaled(w,h,mode) | w:给点宽度 h:给定高度 Mode:缩放模式 | QSize | 返回根据指定的模式将大小缩放为具有给定宽度和高度的矩形,缩放模式是一个枚举类,见后附 |
scaled(QSize,mode) | QSize:给定尺寸 Mode:缩放模式 | QSize | 返回根据指定的模式将大小缩放为具有给定宽度和高度的矩形,缩放模式是一个枚举类,见后附 |
transpose() | None | None | 将对象的宽和高的数据交换 |
transposed() | None | QSize | 返回交换了宽和高的Qsize对象 |
toSF(self) | None | QSF | 将此单精度尺寸转换为浮点精度的尺寸 |
toTuple(self) | None | tuple(w,h) | 返回一个包含宽和高的尺寸元组 |
boundedTo(self, arg__1) | arg_1:QSize | QSize | 返回一个包含此大小和给定大小的最小尺寸 |
expandedTo(self, arg__1) | arg_1:QSize | QSize | 返回一个包含此大小和给定大小的最大尺寸 |
grownBy(self, m) | m:Qmargins | QSize | 在此尺寸上增加一个边距尺寸后的大小 |
shrunkBy(self, m) | m:Qmargins | QSize | 在此尺寸上减去一个边距尺寸后的大小 |
上述方法中,scaled()方法的mode参数是一个枚举类,枚举常量如下:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
Qt.AspectRatio | IgnoreAspectRatio | 0 | 使用给定尺寸对象的尺寸,忽略纵横比。 |
KeepAspectRatio | 1 | 大小在给定矩形内缩放为尽可能大的矩形,同时保持纵横比。 | |
KeepAspectRatioByExpanding | 2 | 大小在给定矩形之外缩放为尽可能小的矩形,同时保持纵横比。 |
关于上述方法的作用,我们看下面的例子:
example:这个例子还是使用QWidget的子类QLabel来作为顶层窗口。
# -*- coding:utf-8 -*-
from PySide6.QtWidgets import QLabel,QPushButton,QApplication
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt,QSize,QMargins
import sys
class window(QLabel):
def __init__(self):
super(window, self).__init__()
self.resize(800,600)
#创建并加载图片,吹风.gif这个图片原始大小为658像素*368像素
self.image = QPixmap("吹风.gif")
self.setPixmap(self.image)
# 让图片显示在窗口顶部
self.setAlignment(Qt.AlignmentFlag.AlignTop)
self.setWindowTitle("QSize方法的示例")
self.setStyleSheet("background:green")
self.My_Ui()
def My_Ui(self):
# 创建一个尺寸对象
size = QSize()
size.setWidth(600)
size.setHeight(600)
# 使用scaled()和scale()方法对比区别
new_size = size.scaled(400, 400, Qt.AspectRatioMode.IgnoreAspectRatio)
print(size)
size.scale(400,400,Qt.AspectRatioMode.IgnoreAspectRatio)
print(size)
# 将主窗口的尺寸与size的尺寸对比后取小的
print(size.boundedTo(self.size()))
# 将主窗口的尺寸与size的尺寸对比后取大的
print(size.expandedTo(self.size()))
# 在size的基础上加上一个margin或者减去一个margin所得到的尺寸
print(size.grownBy(QMargins(10,20,20,15)))
print(size.shrunkBy(QMargins(10,20,20,15)))
# 创建3个按钮放置到合适位置
self.btn1 = QPushButton("图片模式改为Qt.AspectRatioMode.IgnoreAspectRatio",self)
self.btn1.setFixedHeight(50)
self.btn1.move(0,400)
self.btn2 = QPushButton("图片模式改为Qt.AspectRatioMode.KeepAspectRatio", self)
self.btn2.setFixedHeight(50)
self.btn2.move(0, 460)
self.btn3 = QPushButton("图片模式改为Qt.AspectRatioMode.KeepAspectRatioByExpanding", self)
self.btn3.setFixedHeight(50)
self.btn3.move(0, 520)
# 按钮连接到槽函数
self.btn1.clicked.connect(self.changeImage)
self.btn2.clicked.connect(self.changeImage)
self.btn3.clicked.connect(self.changeImage)
def changeImage(self):
# 先清除原有图片
self.clear()
self.mode = None
# 根据传来对象判断是哪个按钮并设置相应的mode
if self.sender() == self.btn1:
self.mode = Qt.AspectRatioMode.IgnoreAspectRatio
elif self.sender() == self.btn2:
self.mode = Qt.AspectRatioMode.KeepAspectRatio
else:
self.mode = Qt.AspectRatioMode.KeepAspectRatioByExpanding
# 调用QLabel的scaled()方法,返回一个新的图片对象
new_image = self.image.scaled(400,300,self.mode)
# 将图片设置给窗口
self.setPixmap(new_image)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = window()
win.show()
sys.exit(app.exec())
运行结果:
20240908-223442
控制台输出结果:
PySide6.QtCore.QSize(600, 600)
PySide6.QtCore.QSize(400, 400)
PySide6.QtCore.QSize(400, 400)
PySide6.QtCore.QSize(800, 600)
PySide6.QtCore.QSize(430, 435)
PySide6.QtCore.QSize(370, 365)
从控制台输出结果来看,scale()与scaled()区别在于:scale()会改变QSize的值,而scaled()则不会,它是依据参数返回一个新的QSize对象。
上例中,为了演示Mode的按个枚举常量所代表的含义,使用了QPixmap的scaled()方法,其作用与QSize的scaled()方法作用一样,mode含义也一样,就是将图片按照mode进行缩放。对于mode模式得说明官方给出下图,更加清晰。
上述尺寸的宽高均是int类型,如果要使用float类型的需使用QSizeF()对象来构造,其它相关API均相同。
对于boundedTo()、expandedTo()和grownBy()、shrunkBy()这两组方法,不多解释,看上面的代码。
3).QRect与QRectF的创建及相关方法
QRect就是构造一个矩形区域对象,相关构造函数及API如下:
API函数 | 参数说明 | 返回值 | 功能作用 |
QRect(x,y,w,h) | x:int,y:int w:int,h:int | None | 通过左上角x,y坐标和宽高创建一个矩形区域对象 |
QRect(P_topleft,size) | P_topleft:QPoint Size:QSize | None | 通过左上角点坐标和宽高尺寸对象创建一个矩形区域对象 |
QRect(P_topleft, P_bottomright) | P_topleft:QPoint P_bottomright: QPoint | None | 通过左上角点坐标和右下角点坐标创建一个矩形区域对象 |
QRect() | None | None | 构造一个空矩形 |
adjust(self, x1, y1, x2, y2) | x1,y1,x2,y2:int | None | 将 x1,y1,x2,y2分别加到当前矩形的坐标上 |
adjusted(self, x1, y1, x2, y2) | x1,y1,x2,y2:int | QRect | 将 x1,y1,x2,y2分别加到当前矩形的坐标上,并返回新矩形 |
x() | None | int | 返回矩形区域左上角x坐标 |
y() | None | int | 返回矩形区域左上角y坐标 |
widget() | None | int | 返回矩形区域宽度值 |
height() | None | int | 返回矩形区域高度值 |
top() | None | int | 返回矩形顶部y坐标 |
topLeft() | None | QPoint | 返回矩形左上角点 |
topRight() | None | QPoint | 返回矩形右上角点 |
bottom() | None | int | 返回矩形底板y坐标,此方法有问题,返回实际为 top () + height () - 1;使用y () + height () 检索真正的 y 坐标 |
bottomLeft() | None | QPoint | 返回矩形左下角的位置。请注意,由于历史原因,此函数返回QPoint ( left (), top () + height () - 1) |
bottomRight() | None | QPoint | 由于历史原因,此函数返回QPoint ( left () + width () -1, top () + height () - 1) |
left() | None | int | 返回矩形左边缘x的坐标 |
right() | None | int | 返回矩形右边缘x的坐标。由于历史原因,此函数返回left () + width () - 1;使用x () + width () 检索真正的 x 坐标 |
size() | None | QSize | 返回矩形的大小 |
center() | None | QPoint | 返回矩形的中心点 |
Contains(point,proper) | Point:QPoint Proper:bool | bool | 如果给定点在矩形的内部或边缘上,则返回True,否则返回false。如果property为真,该函数仅在给定点在矩形内(即不在边缘上)时返回。 |
Contains(rect,proper) | rect:QRect Proper:bool | bool | 给定矩形在此矩形内返回true。否则返回false。如果property为真,则此函数仅true在矩形完全在此矩形内(不在边缘上)时返回。 |
Contains(x,y) | X:int Y:int | bool | 如果给定点在矩形的内部或边缘上,则返回True,否则返回false。 |
Contains(x,y,proper) | X:int Y:int Proper:bool | bool | 如果给定点在矩形的内部或边缘上,则返回True,否则返回false。如果property为真,该函数仅在给定点在矩形内(即不在边缘上)时返回。 |
getRect() | None | Tuple[int,int,int,int] | 获取矩形的左上角坐标和宽高 |
getCoords() | None | Tuple[int,int,int,int] | 获取矩形左上角和右下角坐标 |
isNull() | None | bool | 判断一个矩形是否为空矩形 |
intersected(r) | QRect | QRect | 返回本矩形与给定矩形相交部分的矩形 |
intersects(r) | QRect | bool | 判断本矩形是否与给定矩形相交 |
united(r) | QRect | QRect | 返回本矩形与给定矩形边缘为边界组成的矩形 |
transposed() | None | QRect | 返回交换了宽高的矩形副本 |
translate(x,y) | X:int Y:int | None | 相对于当前位置,沿 x 轴移动矩形dx ,沿 y 轴移动dy 。正值将矩形向右和向下移动。 |
translate( p ) | P:QPoint | None | 相对于当前位置,沿 x 轴移动矩形dx ,沿 y 轴移动dy 。正值将矩形向右和向下移动。 |
translated(x,y) | X:int Y:int | QRect | 返回相对于当前位置平移的矩形的副本x () 沿 x 轴偏移,y () 沿 y 轴偏移 |
translated(p) | P:QPoint | QRect | 返回相对于当前位置平移的矩形的副本x () 沿 x 轴偏移,y () 沿 y 轴偏移 |
setX(x) | X:int | None | 设置矩形左上角x坐标 |
setY(y) | Y:int | None | 设置矩形左上角y坐标 |
setWidth(w) | W:int | None | 设置矩形宽度 |
setHight(h) | H:int | None | 设置矩形高度 |
setRect(x,y,w,h) | X:int, y:int, w:int, h:int, | None | 设置矩形大小及位置 |
setSize(size) | Size:QSize | None | 设置矩形大小 |
setLeft(left) | Left:int | None | 将矩形的左边缘设置为给定的x坐标。可以改变宽度,但永远不会改变矩形的右边缘 |
setRight(right) | Right:int | None | 将矩形的右边缘设置为给定的x坐标。可以改变宽度,但永远不会改变矩形的左边缘 |
setTop(top) | Top:int | None | 将矩形的顶部边缘设置为给定的y坐标。可以改变高度,但永远不会改变矩形的底部边缘 |
setTopLeft(pos) | Pos:QPoint | None | 将矩形的左上角设置为给定的y坐标。可以改变大小,但永远不会改变矩形的右下角 |
setTopRight(pos) | Pos:QPoint | None | 将矩形的右上角设置为给定的y坐标。可以改变大小,但永远不会改变矩形的左下角 |
setBottom(bottom) | Bottom:int | None | 将矩形的底部边缘设置为给定的y坐标。可以改变高度,但永远不会改变矩形的底部边缘 |
setBottomLeft(pos) | Pos:QPoint | None | 将矩形的左下角设置为给定的y坐标。可以改变大小,但永远不会改变矩形的右上角 |
setBottomRight(pos) | Pos:QPoint | None | 给定右下,不改变左上 |
setCoords(x1,y1,x2,y2) | x1:int, y1:int, x2:int, y2:int, | None | 设置矩形的左上角坐标和右下角坐标 |
marginsAdded(self, margins) | margins:QMargins | QRect | 返回一个当前矩形加上一个边距组成新矩形 |
marginsRemoved(self, margins) | margins:QMargins | QRect | 返回一个当前矩形减去一个边距组成新矩形 |
moveBottom(self, pos) | pos:int | None | 垂直移动矩形,使矩形的底边保持在给定的y坐标上。矩形的大小不变。 |
moveBottomLeft(self, p) | p:QPoint | None | 移动矩形,使左下角保持在给定位置。矩形的大小不变 |
moveBottomRight(self, p) | p:QPoint | None | 移动矩形,使右下角保持在给定位置。矩形的大小不变 |
moveCenter(self, p) | p:QPoint | None | 移动矩形,使中心点保持在给定位置。矩形的大小不变 |
moveLeft(self, pos) | pos:int | None | 水平移动矩形,使矩形的左边保持在给定的x坐标上。矩形的大小不变。 |
moveRight(self, pos) | pos:int | None | 水平移动矩形,使矩形的右边保持在给定的x坐标上。矩形的大小不变。 |
moveTo(self, p) | p:QPoint | None | 移动矩形,使左上角保持在给定位置。矩形的大小不变 |
moveTop(self, pos) | pos:int | None | 垂直移动矩形,使矩形的顶边保持在给定的y坐标上。矩形的大小不变。 |
moveTopLeft(self, p) | p:QPoint | None | 移动矩形,使左上角保持在给定位置。矩形的大小不变 |
moveTopRight(self, p) | p:QPoint | None | 移动矩形,使右上角保持在给定位置。矩形的大小不变 |
normalized(self) | None | QRect | 返回一个规范化矩形;也就是说,一个具有非负宽度和高度的矩形。 如果width() < 0,函数将交换左右角,如果height() < 0,函数将交换上下角。与此同时,角落也从非包容性转变为包容性。 |
span(self, p1, p2) | p1:QPoint p2:QPoint | QRect | 返回一个矩形,这个矩形的左上及右下角为p1和p2,矩形包含这p1和p2中的所有点 |
example:
# -*- codeing:utf-8 -*-
from PySide6.QtWidgets import QWidget,QApplication,QPushButton
from PySide6.QtCore import QPoint,QMargins
import sys
class testWindow(QWidget):
def __init__(self):
super(testWindow, self).__init__()
self.resize(500,500)
self.setWindowTitle("QRect测试")
print("主窗口的矩形尺寸为:",self.rect())
print("主窗口的矩内容矩形为:",self.contentsRect())
self.setContentsMargins(20,30,20,30)
new_rect = self.contentsRect()
print("主窗口设置内容边距后的内容矩形new_rect为:",new_rect)
point = new_rect.topLeft()
size = new_rect.size()
test_win1 = QWidget(self)
test_win1.setStyleSheet("background:red")
test_win1.move(point)
test_win1.resize(size)
# adjusted()与adjust()两个方法的对比
return_rect = new_rect.adjusted(20,20,30,30)
print("adjusted后的new_rect为:",new_rect)
print("adjusted后返回的return_rect为:", return_rect)
new_rect.adjust(30,30,20,20)
print("adjust后的new_rect为:",new_rect)
# 当proper参数取True或者Flase时的区别
print("当proper参数为True时,点是否在new_rect内:",new_rect.contains(QPoint(40, 450), True))
print("当proper参数为Flase时,点是否在new_rect内:",new_rect.contains(QPoint(40, 450), False))
# intersects()与intersected()的区别
print("new_rect是否与return_rect相交:",new_rect.intersects(return_rect))
print("返回new_rect与return_rect相交的矩形为:",new_rect.intersected(return_rect))
print("new_rect加上一个margin:",new_rect.marginsAdded(QMargins(10,10,10,10)))
print("new_rect减去一个一个margin:",new_rect.marginsRemoved(QMargins(10, 10, 10, 10)))
if __name__ == '__main__':
app = QApplication(sys.argv)
win = testWindow()
win.show()
sys.exit(app.exec())
运行结果:
控制台输出结果:
主窗口的矩形尺寸为: PySide6.QtCore.QRect(0, 0, 500, 500)
主窗口的矩内容矩形为: PySide6.QtCore.QRect(0, 0, 500, 500)
主窗口设置内容边距后的内容矩形new_rect为: PySide6.QtCore.QRect(20, 30, 460, 440)
adjusted后的new_rect为: PySide6.QtCore.QRect(20, 30, 460, 440)
adjusted后返回的return_rect为: PySide6.QtCore.QRect(40, 50, 470, 450)
adjust后的new_rect为: PySide6.QtCore.QRect(50, 60, 450, 430)
当proper参数为True时,点是否在new_rect内: False
当proper参数为Flase时,点是否在new_rect内: False
new_rect是否与return_rect相交: True
返回new_rect与return_rect相交的矩形为: PySide6.QtCore.QRect(50, 60, 450, 430)
new_rect加上一个margin: PySide6.QtCore.QRect(40, 50, 470, 450)
new_rect减去一个一个margin: PySide6.QtCore.QRect(60, 70, 430, 410)
从上面的例子可以看出adjust()方法是将QRect本身的值改变了,而adjusted()则是返回了一个新的QRect。
对于一个矩形,例如new_rect的adjust()过程如下:
cotains()方法的参数proper,当True时,边缘的点算作QRect内部,而Flase则不算。如上例的点(40,450)在矩形的左侧边,可以看到proper为True和Flase的输出结果。
其它的方法看含义就能理解,不多罗列。这里将QRect的角点/宽高/坐标进行示意:
另外,intersected()与united()的区别如下:
4.)QMargins与QMarginsF的创建及相关方法
QMargin定义了一组4个边距;Left、top、right和bottom,它们描述了矩形周围边框的大小。
isNull()函数只有在所有边距都设置为0时才返回true。
API函数 | 参数说明 | 返回值 | 功能作用 |
QMargins(self) | None | None | 创建一个QMargins对象 |
QMargins(self,QMargins) | QMargins: Qtcore.QMargins | None | 创建一个QMargins对象 |
QMargins(self, left, top, right, bottom) | left: int, top: int, right: int, bottom: int | None | 创建一个QMargins对象 |
bottom(self) | None | int | 获取底边距 |
top(self) | None | int | 获取顶边距 |
left(self) | None | int | 获取左侧边距 |
right(self) | None | int | 获取右侧边距 |
isNull(self) | None | bool | 当所有边距均为0时返回True,否则返回false |
setBottom(self,bottom) | bottom:int | None | 设置底边距 |
setTop(self,top) | top:int | None | 设置顶边距 |
setLeft(self,left) | left:int | None | 设置左侧边距 |
setRight(self,right) | right:int | None | 设置右侧边距 |
toMarginsF(self) | None | QMarginsF | 转换为QMarginsF |
QMargins的参数均为int类型,当需要参数为float时,请会用QMarginsF。QMarginsF的内置方法与QMargins一致,QMarginsF转换为QMargins的方法时,QMarginsF.toMargins()。
说明:QPoint与QOPointF、QSize与QSizeF、QRect与QRectF、QMargins与QMarginsF这几个几何类的加、减、比较等方法并未列出,这些方法在前面的控件学习中几乎用不到。在学习绘图章节时,可以再回来看文档。