第四节 PyQt5之QWidget对象(可视化控件基类)

QWidget的描述

  1. QWidget是所有的可视化空间的基类;
  2. 是一个最简单的空白控件;
  3. 控件是用户界面的最小元素;
  4. 每个控件都是矩形的,并且按照Z轴顺序排序;
  5. 控件由其父控件和前面的空间剪切得到;
  6. 没有父控件的空间,称之为窗口;
  7. 继承自QObject;
import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.show()
sys.exit(app.exec_())
# 运行以上代码将展示如下界面

第四节 PyQt5之QWidget对象(可视化控件基类)_第1张图片

QWidget的继承:直接继承自QObject;

# 获得父类链条
mros = QWidget.mro()
for o in mros:
    print(o)
# 
# 
# 
# 
# 
# 

QWidget窗口的创建

# 主要包含了我们常用的一些类,汇总到了一块
from PyQt5.Qt import *
import sys
# 创建一个应用程序对象
app = QApplication(sys.argv)
# 3、控件的操作
# 3.1、创建控件
window = QWidget()  # 创建一个主程序框
# 3.2、设置控件
window.setWindowTitle('')
window.resize(500, 500)
# 3.3、展示控件
window.show()
# 4、应用程序的执行、进入消息循环。使整个程序进入无限循环
sys.exit(app.exec_())

大小位置设置(控件的坐标系统)

第四节 PyQt5之QWidget对象(可视化控件基类)_第2张图片
顶层窗口的坐标原点是电脑屏幕的左上角,子控件的原点为父控件的左上角,同时都以向下和向上为y轴和x轴的正方向;

获取位置

相关的API:

window = QWidget()
# 获取控件相对于原点x向的位移
window.x()
# 获取控件相对于原点y方向的位移
window.y()
# 同时获取控件相对于原点的x和y值
window.pos()
# 获取控件的宽
window.width()
# 获取控件的高
window.height()
# 同时获取控件的宽和高
window.size()
# 同时获取控件的位置和尺寸
window.geometry()
# 获取宽和高,并默认控件位置为原点
window.rect()

设置控件位置

相关API:

window = QWidget()
# 设置控件的位置
window.move(x, y)
# 设置控件的大小
window.resize(w, h)
# 同时设置控件的位置以及大小
window.setGeometry(x, y, w, h)
# 使控件根据内容自适应大小
window.adjustSize()
# 设置固定尺寸
window.setFixedSize()

设置控件的最大尺寸和最小尺寸

设置了最大和最小尺寸之后,控件大小的调整只能在设定的区间内改变,同样也分为获取和设置;
获取最大和最小尺寸:

相关API

window = QWidget()
# 最小尺寸的宽度
window.minimumWidth()
# 最小尺寸的高度
window.minimumHeight()
# 同时获取最小尺寸
window.minimumSize()
# 最大尺寸的宽度
window.maximumWidth()
# 最大尺寸的高度
window.maximumHeight()
# 最大尺寸
window.maximumSize()

设置最大和最小尺寸:

相关API

window = QWidget()
# 设置最大宽度
window.setMaximumWidth()
# 设置最大高度
window.setMaximumHeight()
# 设置最大尺寸
window.setMaximumSize()
# 设置最小宽度
window.setMinimumWidth()
# 设置最小高度
window.setMinimumHeight()
# 设置最小尺寸
window.setMinimumSize()

内容边距的设定

了解这部分的内容之前首先我们要了解的是,什么是内容区域。

相关APL

# 设置内容边距
setContentsMargins(,,,)
# 获取内容边距
getContentsMargins()	# return:(左, 上, 右, 下)
# 获取内容区域
contentsRect()

应用场景: 调整控件内容边距, 使得显示更好看

代码示例

window = QWidget()
window.resize(500, 500)
lab = QLabel(window)
# 设置文本框内容
lab.setText('文本框')
# 设置文本框大小
lab.resize(300, 300)
# 设置文本框背景颜色
lab.setStyleSheet("background-color:red;")
# 获得内容区域位置
print(lab.getContentsMargins())  # return:(左, 上, 右, 下)
# 上面的这些设置生成的效果如下
# 默认下’文本框‘内容显示的位置是水平靠,竖直居中的

第四节 PyQt5之QWidget对象(可视化控件基类)_第3张图片

# 设置内容区域
lab.setContentsMargins(100, 0, 0, 0)

第四节 PyQt5之QWidget对象(可视化控件基类)_第4张图片

# 设置内容区域
lab.setContentsMargins(0, 100, 0, 0)

第四节 PyQt5之QWidget对象(可视化控件基类)_第5张图片

鼠标相关操作

设置鼠标形状

相关API

# 设置鼠标形状的API为:
setCursor(QCursor)	# 括号内枚举值为QCursor对象

代码示例

# 修改鼠标形状示例
window = QWidget()
# 设置鼠标形状
window.setCursor(Qt.WaitCursor)
# 当鼠标移动至控件内部的时候鼠标形状将发生变化

QCursor的枚举值有以下几种:

枚举值 效果
Qt.ArrowCursor 在这里插入图片描述
Qt.UpArrowCursor 在这里插入图片描述
Qt.CrossCursor 在这里插入图片描述
Qt.IBeamCursor 在这里插入图片描述
Qt.WaitCursor 在这里插入图片描述
Qt.BusyCursor 在这里插入图片描述
Qt.ForbiddenCursor 在这里插入图片描述
Qt.PointingHandCursor 在这里插入图片描述
Qt.WhatsThisCursor 在这里插入图片描述
Qt.SizeVerCursor 在这里插入图片描述
Qt.SizeHorCursor 在这里插入图片描述
Qt.SizeBDiagCursor 在这里插入图片描述
Qt.SizeAllCursor 在这里插入图片描述
Qt.SplitVCursor 在这里插入图片描述
Qt.SplitHCursor 在这里插入图片描述
Qt.OpenHandCursor 在这里插入图片描述
Qt.ClosedHandCursor 在这里插入图片描述
Qt.BlankCursor 在这里插入图片描述

自定义鼠标形状

实现自定义鼠标形状,需要创建QCursor对象

相关API

# 创建QCursor对象
QCursor()
# 创建一个QPixmap对象
QPixmap()
pos()
setPos(x, y)

代码示例

# 设置鼠标形状可以使用枚举值,也可以自定义
window = QWidget()
# 创建QPixmap对象,热点值默认为中点位置
pixmap = QPixmap("图片路径", 热点值1, 热点值2)
# 设置图片大小
pixmap = pixmap.scaled(w, h)	# 缩放是一个返回值,并不会改变原来图片的大小
# 创建QCursor对象
cursor = QCursor(pixmap)
window.setCursor(cursor)

重置鼠标形状

所谓的重置鼠标形状,顾名思义就是在设置了鼠标形状之后想要恢复原鼠标形状的操作;

# 重置鼠标形状
window.unsetCursor()

获取鼠标

通过获取鼠标,可以间接的获取鼠标的图片、鼠标的位置等信息;详细方法可以查看QCursor类的内容;

window = QWidget()
# 获取鼠标
cursor = window.cursor()
# 获取鼠标位置,相对于电脑屏幕
print(cursor.pos())		# return:PyQt5.QtCore.QPoint(577, 789),获得的是鼠标相对主屏幕的位置
# 设置鼠标位置
cursor.setPos()
# 获取鼠标图片
cursor.pixmap()

鼠标跟踪

所谓的鼠标跟踪,其实就是设置检测鼠标移动事件的条件。如果没有设置鼠标跟踪,鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件。但在设置鼠标追踪之后,鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件。
首先尝试当不设置鼠标追踪时,监听鼠标事件的情况:

# 为了看到事件触发的效果,重写QWidget类中的事件方法
# 重写类时间方法的意义在于,将重写的方法取代原有方法,不在事件发射是和receiver一起传递给QApplication
class NewQWidget(QWidget):
    def mouseMoveEvent(self, evt)
        print("鼠标移动了")
# 创建一个控件对象
window = NewQWidget()
window.show()
# 运行该代码需要触发mouseMoveEvent需要鼠标点下

再来看看设置了鼠标跟踪之后的情况:

# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
    def mouseMoveEvent(self, evt):
        print("鼠标移动了")
# 创建一个控件对象
window = NewQWidget()
# 设置鼠标跟踪
window.setMouseTracking(True)
window.show()
# 运行该代码需要触发mouseMoveEvent不需要鼠标点下

事件相关操作

窗口的显示和关闭事件

# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
    def showEvent(self, QShowEvent):
        print("窗口被展示了")
    def closeEvent(self, QCloseEvent):
        print("窗口被关闭了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口被创建和关闭时会触发相关的打印操作
window = NewQWidget()
window.show()

窗口移动事件

# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
    def moveEvent(self, QMoveEvent):
        print("窗口被移动了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口被移动时会触发相关的打印操作
window = NewQWidget()
window.show()

调整大小事件

# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
    def resizeEvent(self, QResizeEvent):
        print("窗口大小改变了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口大小被时会触发相关的打印操作
window = NewQWidget()
window.show()

鼠标事件

# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
    def enterEvent(self, QEvent):
        print("鼠标进入了")
    def leaveEvent(self, QEvent):
        print("鼠标离开了")
    def mousePressEvent(self, QMouseEvent):
        # 注意:鼠标的按下有左右之分
        print("鼠标被按下了")
    def mouseReleaseEvent(self, QMouseEvent):
        print("鼠标被释放了")
    def mouseDoubleClickEvent(self, QMouseEvent):
        print("双击了鼠标")
    def mouseMoveEvent(self, QMouseEvent):
        print("鼠标移动了")
# 在上面介绍的事件中,应该注意的是最后一个,为鼠标追踪事件,可以查看上一小节“鼠标事件”
# 创建一个控件对象
# 由于重写了事件方法,当窗口大小被时会触发相关的打印操作
window = NewQWidget()
window.show()

键盘事件

class NewQWidget(QWidget):
    def keyPressEvent(self, QKeyEvent):
        print("键盘上的某个键被按下了")
    def keyReleaseEvent(self, QKeyEvent):
        print("键盘上的某个键被释放了")
# 创建一个控件对象
window = NewQWidget()
window.show()

键盘事件还有一个非常重要的知识点,就是获取键盘按下的键位:

class NewQWidget(QWidget):
    def keyPressEvent(self, QKeyEvent):
        # 键分为修饰键和普通键,两种键的监听方式是不同的
        # 修饰键:ctrl、shift等键
        # 普通键:abc...123...
        # 当我们不知道某一个键属于哪一个键类型,可以使用下面的判定方法
        if QKeyEvent.key() == Qt.Key_Tab  # 普通键
            print("用户按下了Tab")
        elif QKeyEvent.modifiers() == Qt.ControlModifier:  # 修饰键
            print("用户按下了ctrl")
        elif QKeyEvent.modifiers() == Qt.ControlModifier | Qt.ShiftModifier:  # 修饰键组合
            print("用户按下了ctrl+shift")
        
        elseprint("++++++")
window = NewQWidget()
window.show()

以下事件由于不长使用,故这里只给出其API,使用方法和上述操作类似

焦点事件

# 获取焦点时使用
focusInEvent(QFocusEvent)
# 失去焦点时使用
focusOutEvent(QFocusEvent)

拖拽事件

# 拖拽进入控件时调用
dragEnterEvent(QDragEnterEvent)
# 拖拽离开控件时调用
dragLeaveEvent(QDragLeaveEvent)
# 拖拽在控件内移动时调用
dragMoveEvent(QDragMoveEvent)
# 拖拽放下时调用
dropEvent(QDropEvent)

绘制事件

# 显示控件, 更新控件时调用
paintEvent(QPaintEvent)

改变事件

# 窗体改变, 字体改变时调用
changeEvent(QEvent)

右键菜单事件

# 访问右键菜单时调用
contextMenuEvent(QContextMenuEvent)

输入法

# 输入法改变时调用
inputMethodEvent(QInputMethodEvent)

事件的转发机制

事件转发机制指的是,如上面所展示的截面中,如果我们点击了窗口中的文本框,但是我们并没有对该点击事件进行监听时,该事件会沿着父对象由下至上的传递,及向上分发事件消息;

第四节 PyQt5之QWidget对象(可视化控件基类)_第6张图片

父子关系相关操作

window = QWidegt()
window.resize(500, 500)
lab1 = QLabel(window)
lab2 = QLabel(window)
lab3 = QLabel(window)

lab1.setText("标签1")
lab2.setText("标签2")
lab3.setText("标签3")

lab1.move(0, 0)
lab2.move(0, 100)
lab3.move(0, 200)
# 获取在指定坐标的控件
childAt(0, 100)  # 返回lab2对象
childAt(0, 300)  # 返回None
# 获取指定控件的父控件
lab1.parentWidget()  # 返回QWidegt对象
# 所有子控件组成的边界矩形
window.childrenRect()  # 返回矩形两角点的元组

顶层控件

层级控制的作用是调整空间的Z轴顺序,程序默认的层级顺序是按创建顺序排列;

# 将控件降低到最底层
lower()
# 将控件提升到最上层
raise_()
# 让a放在b下面
a.stackUnder(b)

顶层窗口相关

设置图标

设置的是窗口左上角和任务栏的图片

window = QWidget()
# 设置对象图标
icon = QIcon("图标图片路径")
window.setWindowIcon(icon)
# 获得对象图标
window.windowIcon()

第四节 PyQt5之QWidget对象(可视化控件基类)_第7张图片

设置标题文字

window = QWidget()
# 设置标题文字
window.setWindowTitle("hello pyqt")
# 获取标题文字
window.windowTitle()

窗口透明度设置

window = QWidget()
# 设置窗口透明图,float是一个0-1的浮点数
window.setWindowOpacity(float)
# 获取不透明度
window.windowOpacity()

窗口状态

窗口的状态主要包括:无状态、最小化、最大化、全屏、活动窗口五种;设置的API为setWindowState(state),需要调整窗口状态只是改变state的枚举值;

window = QWidget()
# 无状态,这是默认的窗口状态
window.setWindowState(Qt.WindowNoState)
# 最小化
window.setWindowState(Qt.WindowMinimized)
# 最大化
window.setWindowState(Qt.WindowMaximized)
# 全屏,全屏后需在进程中退出
window.setWindowState(Qt.WindowFullScreen)
# 活动窗口
window.setWindowState(Qt.WindowFullScreen)
# 获得当前窗口状态
window.windowState()

窗口最大化和最小化的设置

设置窗口的大小的方法有以下几种:

# 全屏显示
showFullScreen()
# 最大化
showMaximized()
# 最小化
showMinimized()
# 正常
showNormal()

同时在设置窗口状体之前我们可能需要做的是,获取当前的窗口状态,并通过当前窗口状态的作出相关的设置操作,获取状态的方式有以下几种

# 是否是最小化窗口
isMinimized()
# 是否是最大化窗口
isMaximized()
# 是否全屏
isFullScreen()

通过以上方法可以重新设置窗口最大化和最小化的操作方法

窗口标识

窗口标识即设置作为顶层空间的窗口的样式,API为:

window.setWindowFlags(Qt.WindowStaysOnTopHint)

枚举值Qt.WindowStaysOnTopHint分为窗口样式和顶层窗口外观标识,下面分别介绍这两种窗口标识相关的枚举值;
窗口样式

# 默认窗口样式
Qt.Widget
# 有窗口边框和标题的样式
Qt.Window
# 对话框窗口样式
Qt.Dialog
# 窗口或部件Macintosh表单
Qt.Sheet
# 窗口或部件Macintosh抽屉
Qt.Drawer
# 弹出式顶层窗口
Qt.Popup
# 是一个工具窗口
Qt.Tool
# 提示窗口,没有标题栏和窗口边框
Qt.ToolTip
# 是一个欢迎窗口,是QSplashScreen构造函数的默认值
Qt.SplashScreen
# 是一个子窗口
Qt.SubWindow

顶层窗口外观标识

# 窗口无法调整大小
Qt.MSWindowsFixedSizeDialogHint
# 窗口无边框
Qt.FramelessWindowHint
# 有边框但无标题栏和按钮,不能移动和拖动
Qt.CustomizeWindowHint
# 添加标题栏和一个关闭按钮
Qt.WindowTitleHint
# 添加系统目录和一个关闭按钮
Qt.WindowSystemMenuHint
# 激活最大化和关闭按钮,禁止最小化按钮
Qt.WindowMaximizeButtonHint
# 激活最小化和关闭按钮,禁止最大化按钮
Qt.WindowMinimizeButtonHint
# 激活最小化,最大化和关闭按钮
Qt.WindowMinMaxButtonsHint
# 添加一个关闭按钮
Qt.WindowCloseButtonHint
# 添加问号和关闭按钮,同对话框
Qt.WindowContextHelpButtonHint
# 窗口始终处于顶层位置
Qt.WindowStaysOnTopHint
# 窗口始终处于底层位置
Qt.WindowStaysOnBottomHint

获取窗口标识样式

windowFlags()

交互状态

# 设置控件是否禁用
setEnabled(bool)
# 示例代码
bnt1 = QPushButton(win
bnt1.setText("按钮1")   
bnt2 = QPushButton(win
bnt2.setText("按钮2")   
bnt2.move(0, 100)     
bnt1.setEnabled(True) 
bnt2.setEnabled(False)

第四节 PyQt5之QWidget对象(可视化控件基类)_第8张图片

# 获得控件的是否为禁用状态
isEnabled()
# 是否显示/隐藏
setVisible(bool)
# 展示控件
show()
# 隐藏控件
hide()
# 判定控件是否隐藏
isHidden()
# 获取控件最终状态是否可见
isVisible()
# 设置是否编辑,包括设置窗口标题等等
setWindowModified(bool)
# 窗口是否是被编辑状态
isWindowModified()
# 是否为活跃窗口
isActiveWindow()
# 关闭
close()

信息提示

信息提示包括状态提示、工具提示、点击提示三种。

# 状态提示
setStatusTip(str)
statusTip()

# 工具提示
setToolTip(str)
toolTip()

# 这是啥提示
setWhatsThis(str)
whatsThis()

状态提示:当鼠标停在控件上时,提示显示在展开状态栏;

# 使用QMainWindow创建窗口
# QMainWindow创建的窗口,包含标题栏、操作区、状态栏
window = QMainwindow()
window.resize(500, 500)
# 由于在QMainWindow中创建的相关空间时懒加载的
# 懒加载:是指用到时,才会创建
# 设置状态栏
window.statusBar()

bnt = QPushButton(window)  
bnt.setStatusTip("这是一个按钮") 
# 获取提示文本
bnt.statusTip()

第四节 PyQt5之QWidget对象(可视化控件基类)_第9张图片
工具提示:当鼠标停在控件上时,提示显示控件上;

window = QWidegt()
bnt = QPushButton(window)  
# 设置提示文本
bnt.setToolTip("这是一个按钮") 
# 获取提示文本
bnt.toolTip()
# 设置文本显示的时间
bnt.setToolTipDuration(毫秒)
# 获取显示时间
bnt.toolTipDuration()

第四节 PyQt5之QWidget对象(可视化控件基类)_第10张图片
点击提示:当鼠标显示为一个问号时,点击时显示提示文本;

window = QWidegt()
window.setWindowFlags(Qt.WindowContextHelpButtonHint)
bnt = QPushButton(window)
# 设置提示文本
bnt.setWhatsThis(“这是一个按钮”)
# 获取提示文本
bnt.whatsThis()

第四节 PyQt5之QWidget对象(可视化控件基类)_第11张图片

焦点控制

针对单个控件的方法

# 指定控件获取焦点
setFocus()
# 设置焦点获取策略
# API
setFocusPolicy(Policy)
# Policy枚举值
Qt.TabFocus  # 通过Tab键获得焦点
Qt.ClickFocus  # 通过被单击获得焦点
Qt.StrongFocus  # 可通过上面两种方式获得焦点
Qt.NoFocus  # 不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点
# 示例代码
window = QWidget()     
window.resize(500, 500)
# 默认情况下光标会停留在第一个文本框,同时Tab键的切换是按对象的创建先后                
lt1 = QLineEdit(window)
lt1.move(0, 0)         
lt2 = QLineEdit(window)
lt2.move(0, 100)       
lt3 = QLineEdit(window)
lt3.move(0, 200)
# 设置控件焦点
lt3.setFocus()

当运行程序时,光标会自动停在设置了焦点事件的控件上,否则会停留在第一个创建的控件上;
第四节 PyQt5之QWidget对象(可视化控件基类)_第12张图片

信号

# 窗口标题改变发射信号
windowTitleChanged(QString)
# 窗口图标改变发射信号
windowIconChanged(QIcon)
# 自定义上下文菜单请求信号
customContextMenuRequested(QPoint)

你可能感兴趣的:(PyQt,python,pyqt,gui)