[PyQt6]简开发学习记录Chapter3-PyQt QWidgets模组与功能
QWidget
参考资料: GUI学习之四--QWidget控件学习总结 ,*PyQt6与PyQt5的Qt.Core一些属性存在不同。
本文基于参考资料与个人理解撰写的是针对PyQt6学习笔记。
QWidget 类是所有用户界面对象的基类。
QWidget控件特性:
a.控件是用户界面的基础平台/桌面,有了他才能放各种其他功能小部件。
b.每个控件都是矩形的,他们按照Z轴顺序排序(垂直于桌面),前面的会覆盖后面的。
c.控件由其父控件和前面的控件裁剪,显示区域超不过其父空间大小。
d.没有父控件的控件就是窗口,就是和前面不连贯,单独蹦出来的Window。
1QWidget 大小、位置与功能
1.1功能与作用
from PyQt6.QtWidgets import *
import sys
app=QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
red = QWidget(window)
red.setStyleSheet('background-color:red;')
red.resize(100,100)
window.show()
sys.exit(app.exec_())
控件的创建
- window = QWidget()#创建了主窗口界面。
- red = QWidget(window) #在父窗口window之上创建子窗口。
- window.show() #父窗口及其之上的控件(red)都默认显示出来。
1.2大小和位置
a.获取属性信息
window = QWidget()
window.x() #控件X轴坐标(包含框架窗口)
window.y() #控件Y轴坐标(包含框架窗口)
window.pos() #控件X/Y轴坐标集合
window.width() #控件宽度(不包含窗口框架)
window.height() #控件高度(不包含窗口框架)
window.size() #控件宽度和高度的组合
window.geometry() #用户区域相对于父控件的位置和尺寸组合
window.rect() #(0,0,width,height)的组合
window.frameSize() #整个界面大小(包含框架窗口)
window.frameGeometry()#整个界面(X,Y,Width,height)的集合
b.设置属性信息
window.move(x,y) #控件移动至x,y;包含窗口框架
window.resize(width,height) #设置宽、高,不包含窗口框架
window.setGeometry(x,y,width,height) #设置用户区域的坐标和大小
window.adjustSize() #根据内容自适应尺寸
window.setFixedSize(width,height) #设置固定尺寸 设置后窗口最大化按钮是灰色的,窗口不可拖放
1.3最大尺寸和最小尺寸
*用的不多,不列了,可看参考资料。
1.4内容边距
label.contentsRect() #获取标签内容可以显示的范围
label.getContentsMargins() #获取内容左上右下边距(未定义边距时为(0,0,0,0)
label.setContentsMargins(up,down,left,right) #设定内容区域(左上右下)
1.5鼠标操作
获取鼠标位置
current_cursor = label.cursor()
current_cursor.pos() #获取鼠标位置
current_cursor.setPos(x,y) #设定鼠标位置
获取的鼠标坐标对应的原点是桌面,而不是父控件。
鼠标跟踪
from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
class MyWidget(QWidget):
def mouseMoveEvent(self, a0):
print(self.cursor().pos())
window = MyWidget()
window.setMouseTracking(True) #开启鼠标追踪
print(window.hasMouseTracking())
window.show()
sys.exit(app.exec_())
鼠标追踪
2.QWidget事件机制
2.1事件触发函数机制
a.事件的重写
在QtWidget中事件发生对应是不进行任何命令的,即直接pass,这样做的目的是为了便于重写触发事件命令,其中a0为已经处理好的对应事件发生的形参地址。
from PyQt6.QtWidget import *
import sys
app=QApplication(sys.argv)
class MyWindow(QWidget):
def showEvent(self, a0):
print('窗口被展开',a0)
def closeEvent(self, a0):
print('窗口关闭')
def moveEvent(self, a0):
print('窗口移动')
def resizeEvent(self, a0):
print('改变窗口尺寸')
def mousePressEvent(self, a0):
print('鼠标按下')
def mouseReleaseEvent(self, a0):
print('鼠标弹起')
def mouseDoubleClickEvent(self, a0):
print('鼠标双击') #双击时候会触发鼠标弹起
def enterEvent(self,a0):
print('鼠标进入控件')
def leaveEvent(self,a0):
print('鼠标离开控件')
def keyPressEvent(self, a0):
print('键盘上有按键被按下')
def keyReleaseEvent(self, a0):\
print('键盘上有按键弹起')
def focusInEvent(self, a0):
print('获取焦点')
def focusOutEvent(self, a0):
print('失去焦点')
def dragEnterEvent(self, a0):
print('拖拽进入控件')
def dragLeaveEvent(self, a0):
print('拖拽离开控件')
def dragMoveEvent(self, a0):
print('在控件中拖拽')
def dropEvent(self, a0):
print('拖拽放下')
def paintEvent(self, a0):
print('绘制事件')
def changeEvent(self, a0):
print('改变事件')
def contextMenuEvent(self, a0):
print('右键菜单')
def inputMethodEvent(self, a0):
print('输入法调用')
window = MyWindow()
window.show()
sys.exit(app.exec())
事件API
#此处的定义是对QtWidget中的函数的重写。
a0是事件event,此处为一个函数地址的“形参”。(*参数不一定是具体数据信息,也可以是函数地址)
当运行showEvent(self, a0)时,需等待函数a0对应的event执行时/执行完毕,才轮得到后续的命令运行。
window = MyWindow() #继承自Widget,其中__init__可保持主程序始终处于运行循环。
b.事件的处理
class MyLabel(QLabel):
def mousePressEvent(self, a0):
a0.ignore() #忽略事件,把事件传递给父级控件
a0.accept() #处理事件
a0.isAccepted() #获取是否处理事件
2.2事件转发机制
Widget的控件有事件转发机制:如果一个控件没有处理该事件,则该事件会自动传递给父级控件进行处理。
例如:
class MyLabel(QLabel):
def mousePressEvent(self, a0):
a0.ignore() #忽略事件,把事件传递给父级控件
a0.isAccepted() #获取是否处理事件
a0.accept() #处理事件
2.3组件父子/层级关系属性
a.父子关系
window = QWidget()
label = QLabel(window)
window.childAt(x,y) #获取window内x、y坐标位置存在的控件,无控件返回None
label.parentWidget() #获取控件的父控件
window.childrenRect() #window内所有控件组成的矩形区域(位置、尺寸)(左上角——右下角)
b.层级关系
obj.lower() #控件放在最底层
obj.raise_() #控件放在最顶层
a.stackUnder(b) #a放在b下面
3.顶层窗口UI属性与操作
3.1显示
a.程序图标
icon = QIcon(r'图片路径')
window.setWindowIcon(icon)
b.标题
window.setWindowTitle('')
c.不透明度
window.setWindowOpacity(0.9) #0-1对应透明——不透明
window.windowOpacity() #返回值是个浮点数
不透明度是个浮点数,和设定的值有些许差异,比如设定值为设定值为0.9,获取的值为0.8980
3.2窗口状态
a.窗口 WindowStates 显示状态
状态属性需借助PyQt6.Core.Qt的WindowStates识别。
from PyQt6.QtCore import Qt
Qt.WindowStates.WindowMaximized #表示窗口最大化状态
window.setWindowState(Qt.WindowStates.WindowNoState) #无状态
window.setWindowState(Qt.WindowStates.WindowMaximized) #窗口最大化
window.setWindowState(Qt.WindowStates.WindowMinimized) #窗口最小化
window.setWindowState(Qt.WindowStates.WindowFullScreen) #窗口全屏
window.setWindowState(Qt.WindowStates..WindowActive) #活动窗口
window.windowState() #获取控件状态
活动窗口指的是比如有两个程序,显示在前面的那个就是活动窗口.
b.最大化和最小化
与上述API功能类似
设置
window.showFullScreen() #全屏
window.showMaximized() #最大化
window.showMinimized() #最小化
window.showNormal() #正常显示
window.isMinimized()
window.isMaximized()
window.isFullScreen()
3.3窗口Flags状态
Flags意思为“旗帜”,可理解是整个窗口在电脑窗口中作为旗帜所安置的状态。
window.setWindowFlags() 设置状态
*注意PyQt5与PyQt6状态变量的引用位置不同。
Qt.WindowFlags.MSWindowsFixedSizeDialogHint #窗口大小无法调整
Qt.WindowFlags.FramelessWindowHint #窗口无边框,不可拖动大小,移动位置
Qt.WindowFlags.CustomizeWindowHint #无边框,可以拖动大小,不可移动
Qt.WindowFlags.WindowTitleHint #标题栏只有关闭按钮(且不可用?)
Qt.WindowFlags.WindowSystemMenuHint #效果同上?
Qt.WindowFlags.WindowMaximizeButtonHint #标题栏内只激活最大化按钮
Qt.WindowFlags.WindowMinimizeButtonHint #标题栏内只激活最小化按钮
Qt.WindowFlags.WindowCloseButtonHint #标题栏只有关闭按钮(可用)
Qt.WindowFlags.WindowContextHelpButtonHint #标题栏只有关闭按钮(不可用)问号按钮(可用)
Qt.WindowFlags.WindowStaysOnTopHint #窗口始终显示在最前
Qt.WindowFlags.WindowStaysOnBottomHint #窗口始终显示在最后
窗口标志枚举值
3.4交互状态
btn.setEnabled() #设定是否可用