[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()      #设定是否可用