目录
13.3.1 设置 setWindowModified(bool)¶
15.1.2 设置焦点获取策略 setFocusPolicy(Policy)
15.2.1 获取子控件中当前聚焦的控件 focusWidget()
15.2.3 聚焦上一个子控件 focusPreviousChild()
15.2.4 通过布尔量控制聚焦上一个/下一个控制focusNextPrevChild(bool)
15.2.5 设置子控件获取焦点的先后顺序 setTabOrder(pre_widget,next_widget)
1 Qwidght简介
- Qwidght是QObject的子类,其为所有可视空间的基类
- 他本身是一个最简单的空白控件(控件是用户界面的最小元素)
- 每个控件都是矩形的,控件按照Z轴排序(在界面上为x轴与y轴,z轴为用户面向屏幕的方向,在代码后部的控件会覆盖掉前部的控件)
2 查看父类
在pyqt5中可以通过base来查看指定类型的所有直接父类
- 注:__bases__返回类型为tuple
可以通过mro()查看所有父类(直接与间接)
- 注:mro()返回类型为list
3 使用flag定义不同的标题栏样式
可使用flag定义不同的窗口样式,所有flag内容如下所示
- 在设置非顶层控件位置中,以非顶层控件父控件左上角为坐标原点,向右为x轴正方向,向下为y轴正方向
- 设置顶层控件位置中,以屏幕左上角为坐标原点,向右为x轴正方向,向下为y轴正方向
- 设置的位置均为控件的左上角点与原点的距离
4 获取控件尺寸信息
获取控件尺寸信息方法如下
- 注:如要获取准确的位置信息,必须要在show()之后
运行结果
5 设置控件尺寸
设置控件尺寸信息方法如下
设置控件位置时可将位置设置为负值,可通过此方法隐藏窗口
设置带标题栏窗口控件大小时会有最小宽度限制,限制为能放下 最小化,最大化和关闭 这三个按钮
6 最小最大尺寸限定
6.1 设置固定尺寸
运行结果,运行之后无法拖动并可以看出最大化按钮变为灰色
6.2 设置最大最小尺寸
注:如不设置最大默认为最大化尺寸且可最大化
直接设置尺寸
设置宽度
设置完尺寸后,使用resize也无法改变大小
7 内容区域边距操作
7.1 控件区域与内容区域
上面这段代码中label的控件区域为青色部分,在未设置控件区域时控件区域默认等于内容区域
- 可以看出控件在展示的时候水平方向默认靠最左,竖直方向默认为居中
7.2 获取内容区域
运行结果
显示结果的含义为:在父控件的(0,0)点,自左上到右下绘制300*300的矩形框
7.3 设置内容区域
方法中四个参数依次为:左边距,上边距,右边距,下边距,单位为像素
例为调整内容区域左边距
运行结果:
将上边距调为200
8 鼠标相关
8.1 鼠标样式
可选择的样式如下
通过setCursor方法设置鼠标样式,setCursor参数如下
- 第一个参数为可选的样式,如Qt.ArrowCursor
- 第二个参数为想设置的鼠标对象
8.2 自定义鼠标样式
发现图片太大了,让鼠标图片变小一些
对鼠标有效点击位置不满意,通过QCursor设置有效点击位置
其中有效位置默认为-1,-1,大致在图片的中心位置
将点击位置设置为(0,0)(图片左上角)
将点击位置设置为(50,50)(图片右下角,因为图片大小为50*50)
8.3 重置鼠标形状
- 注:方法的对象为窗口
8.4 获取鼠标对象
8.4.1 获取鼠标位置
- 注:此位置为相对整个电脑屏幕的位置
8.4.2 设置鼠标位置
发现鼠标在屏幕的左上角出现
8.5 鼠标跟踪
鼠标跟踪:设置检测鼠标移动实践的条件
- 不跟踪时:鼠标必须处于按下状态,才会触发mouseMoveEvent事件
- 跟踪时:鼠标移动时,无论按下不按下,都会触发mouseMoveEvent事件
在不设置时,默认为不追踪鼠标
8.5.1 默认(不追踪)
注:
- 此方法直接在class Window(QWidget)下
- 方法中me为形参,默认为QMouseEvent
当按住鼠标在窗口中移动时,运行结果
8.5.2 检查是否设置鼠标追踪
8.5.3 设置鼠标追踪
8.5.4 获取鼠标位置
a.全局位置
- 全局位置是对于显示器的位置
b.局部位置
- 局部位置是对于窗口的位置
9 事件消息
事件列表如下,所有事件均只能在控件中触发
9.1 显示和关闭事件
9.1.1 显示事件
运行代码后的运行结果
9.1.2 关闭事件
关闭窗口后的运行结果
9.2 移动事件
在运行后未拖动时会打印一次
拖动后会打印一串
9.3 调整尺寸事件
运行后未改变大小时会打印一次
改变大小后会打印一串
9.4 鼠标事件
9.4.1 鼠标进入事件
9.4.2 鼠标离开事件
离开窗口时
多次离开窗口时
9.4.3 鼠标按下事件
按下鼠标时
多次按下鼠标时
9.4.4 鼠标抬起事件
抬起鼠标时
多次抬起鼠标时
9.4.5 鼠标双击事件
双击鼠标时
多次双击鼠标时
9.4.6 鼠标移动事件
若没追踪鼠标则需按下时触发,运行后按下移动结果
9.5 键盘事件
9.5.1 键盘按下事件
按下一次
按下多次
9.5.2 键盘抬起事件
抬起一次
抬起多次
9.6 焦点事件
焦点:例如一个窗口中有两个文本框,如果在文本框中输入其信息则要首先获取其焦点,类似于输入文本的符号在哪焦点就在哪
- focusInEvent(QFocusEvent)获取焦点事件
- focusOutEvent(QFocusEvent)失去焦点事件
9.7 拖拽事件
拖拽:例如微信传输文件的时候,可将要传输的文件拖进输入栏之后发送,其中的拖拽动作叫做拖拽
- dragEnterEvent(QDragEnterEvent)拖拽进入控件事件
- dragLeaveEvent(QDragLeaveEvent)拖拽离开控件事件
- dragMoveEvent(QDragMoveEvent)拖拽在控件内移动事件
- dropEvent(QDropEvent)拖拽放下事件
9.8 绘制事件
绘制:我们看到的所有控件是计算机绘制出来的(包括但不限于绘制背景颜色,绘制控件上的文字),在绘制时触发该类型事件
- paintEvent(QPaintEvent)显示控件,更新控件时调用
9.9 改变事件
- changeEvent(QEvent)窗体改变,字体改变(中英文切换)时调用
9.10 右键菜单
- contexMenuEvent(QContexMeauEvent)访问右键菜单时调用
9.11 输入法事件
- inputMethodEvent(QInputMethodEvent)输入法调用
9.12 事件分发与事件转发
9.12.1 事件分发
事件分发指一个事件信号到最终触发槽函数的过程
9.12.2 事件转发
一个事件信号传递给一个控件,但控件没有执行任何操作,此时此事件信号会被转发给控件父对象,转发的过程叫事件转发
此时我们有顶层(青色),中层(红色),底层(黄色)三个层级的窗口
对三个窗口设置不同的事件
此时我们点击底层窗口(黄色)区域
之后我们再取消掉中层窗口事件
点击黄色区域
可以使用.accept()阻止事件转发 accept表示事件已被接收
经过测试,直接在事件方法下写pass的同样不会向上一级传递
可通过isAccepted查看事件是否被接收
即使有事件输入,我们依然可以使用ignore()使事件向上传递
点击一次底层控件(黄色区域)后的运行结果
此时我们查看中层窗口的事件接收状态,为避免变量引起误会,我们将变量改为evt
可以证明如果我们底层代码ignore事件后,相当于点击中层窗口
中层窗口同样可以使用ignore
10 父子关系
10.1 childAt()
通过childAt,寻找在指定位置的子对象
运行结果
可以看到有一个标签为self的子控件,且位置在(55,55)
我们再将位置改变为(255,255)
发现在该点没有子控件,返回值为None
10.2 parentWidget()
可使用parentWidget()查找父控件
运行结果
10.3 childrenRect()
可使用childrenRect()查看所有子控件所组成的边界矩形
运行结果
起始点为(0,0),x为200,y为130
更改标签一的位置再测试一下
运行结果
起始点变为(50,50),长为250,宽为180
11 层级控制
控件默认按照Z轴摆放,通过以下三个API改变控件Z轴放置顺序
- lower()将控件降低到最底层
- raise_()将控件提升到最上层
- a.stackUnder(b)让a放在b下面
当前我们设置两个标签
我们通过上面的三种方式把黄色区域放到下方
11.1 lower()
11.2 raise_()
11.3 a.stackUnder(b)
12 顶层窗口相关
12.1 图标
12.1.1 设置
使用QIcon与setWindowIcon配合设置图标
运行结果
- 注:菜单栏里的图标并没有发生改变
12.1.2 获取
通过.windowIcon()获取图标对象
运行结果
12.2 标题
12.2.1 设置
通过.setWindowTitle()设置窗口标题
运行结果
12.2.2 获取
通过.windowTitle()获取标题信息
运行结果
12.3 不透明度
12.3.1 设置
可通过setWindowOpacity()设置窗口不透明度
参数可以为任意浮点数
运行结果
12.3.2 获取
通过windowOpacity()获取不透明度
运行结果
12.4 窗口状态
12.4.1 设置
通过setWindowState()设置窗口状态,可接受的参数如下
- Qt.WindowNoState 无状态(正常状态)
- Qt.WindowMinimized 最小化
- Qt.WindowMaximized 最大化
- Qt.WindowFullScreen 全屏 (默认按Esc并不能退出全屏,在默认情况下想退出时使用Alt + F4)
- Qt.WindowActive 活动窗口
无状态
- 若为单一窗口活动状态与无状态显示相同,在有多个窗口时,将窗口设置为活动状态,活动状态的窗口会跑到最前面,如果设置多个活动状态窗口,最后一个设置的活动状态的窗口会跑到最前面
12.4.2 获取
使用.windowState()获取窗口状态
运行结果
12.5 最大化最小化
我们可以设置一个按钮,对窗口进行最大化最小化操作
12.5.1 控制
- showFullScreen() 窗口全屏展示
- showMaximized() 窗口最大化展示
- showMinimized() 窗口最小化展示
- showNormal() 窗口普通形式展示
使用方式
(在window.show()中替换掉show)
12.5.2 判定
- isMinimized()是否为最小化
- isMaximized()是否为最大化
- isFullScreen()是否为全屏
12.6 窗口标志
将窗口样式与外观标志放在一起就可以了,不需要同时设置
12.6.1 窗口样式(Qt_windowType)
设置方法,setWindowFlags可以设置一个Flags,也可以设置多个flags
样子就是以下几种
Qt.Widget
Qt.Sheet
Qt.Draver
Qt.window(从外观看与Qt.widget没有区别)
Qt.Dialog(从外观看与sheet没区别)
Qt.Popup(无边框)
Qt.tool
Qt.Desktop一直在运行,运行过程中什么也没出现
Qt.ToolTip
Qt.SplashScreen
Qt.SubWindow
12.6.2 外观标志
设置方式
参数如下
为今后方便复制,外观列表如下:
- Qt.MsWindowsFixedSizeDialogHint 窗口无法调整大小
- Qt.FramelessWindowHint 窗口无边框
- Qt.CustomizeWindowHint 有边框但无标题栏和按钮,不能移动和拖动
- Qt.WindowSystemMenuHint 添加系统目录和一个关闭按钮
- Qt.WindowMaximizeButtonHint 激活最大化和关闭按钮,禁止最小化按钮
- Qt.WindowMinMaxButtonsHint 激活最小化,最大化和关闭按钮
- Qt.WindowCloseButtonHint 添加一个关闭按钮
- Qt.WindowContextHelpButtonHint 添加问号和关闭按钮,同对话框
- Qt.WindowStayOnTopHint 窗口始终处于顶层位置
- Qt.WindowStaysOnBottomHint 窗口始终处于底层位置
13 交互状态
交互状态为是否要将一个控件设置为某种状态
13.1 是否可用
- setEnabled(bool)设置空间是否可用,True为可用,False为禁用
- isEnabled()获取控件是否可用
13.1.1 setEnabled(bool)
以一个按钮为例
我们现在将其禁用
运行后,发现界面的按钮灰了,也点不了了
13.1.2 isEnabled()
13.2 是否显示/隐藏
显示与隐藏的概念为,
如果绘制了该控件则为显示,没绘制该控件则为隐藏
- 注: 事件中并没有擦除事件,比如点击这个按钮然后隐藏这个按钮,只是在下一轮消息中不绘制
13.2.1 设置
True为显示,False为隐藏
- 注:如果父控件没有绘制出来,子控件为True也展示不出来
True
False
其中和这个方法相同功能还有
- setHidden(bool)是否隐藏
- show()展示控件
- hide()隐藏空间
13.2.2 获取
13.2.2.1 isHidden()
- 注:isHidden()的判定条件为自身被隐藏,如果仅因为其父控件被隐藏导致其不可见则此时isHiddden()为False
13.2.2.2 isVisble
如果在方法中使用btn.isVisiable()显示为False,因为此时这个按钮并没有被绘制出来
按钮是在window被绘制出来后才被绘制出来
运行结果
13.2.2.3 isVisibleto(widght)
如果控件能随指定控件显示或隐藏则为True,反之则为False,即使在父控件没有被显示的时候,只要对应关系存在则为True
13.3 是否编辑
以word举例,如果在修改文档且未保存的情况下关闭文档,会提示是否保存,这个状态就叫做编辑状态
这个状态可以被监听,例如在记事本中,没有编辑的时候
有编辑的时候
13.3.1 设置 setWindowModified(bool)¶
True为编辑状态,Flase为非编辑状态
13.3.2 获取 isWindowModified()
13.4 是否为活跃窗口
以记事本举例,编辑后未保存后关闭,会弹出一个窗口
此时只能优先与这个窗口内的控件进行互动,这个窗口的状态就叫活跃状态
- 注:并不是谁显示在最前面,谁就为活动窗口
13.4.1 获取 isActivateWindow()
怎么设置活跃窗口在网课中没讲,我到库文件中看了一下有一个名称相似的
测试了一下,把这行写入代码之后,后面isActivateWindow()返回的还是False
13.5 关闭 close
此时的关闭就是一种隐藏的方式,此时按钮并没有被释放
我们可以对按钮添加一个属性,当执行close时,释放其控件
- 注:这个方式只有执行close时会被释放,其他隐藏方式并不会被释放
14 信息提示
14.1 状态提示
- 当鼠标移动到指定控件上时,在状态栏中显示提示信息
在设置状态提示之前,在窗口的下面需要有一个状态栏,普通的window是没有状态栏的,所以咱们使用QMainWindow()
懒加载:只有用到的时候才会加载
QMainWindow的状态栏为懒加载,所以要再访问状态栏
此时我们看到窗口的下方有一个三角标记,这个就是状态栏的标记
14.1.1 设置
setStatusTip()中间的参数为提示文字
当鼠标移动到label区域的时候,会在状态栏显示hello world
14.1.2 获取 statusTip()
14.2 工具提示
- 当鼠标悬停在控件上一会儿后,在旁边显示提示信息
14.2.1 设置
- 显示提示信息后,过一段时间该信息会消失,此事件可控制
14.2.1.2 工具提示保留时长 label.setToolTipDuration()
单位为ms
14.2.2 获取
14.2.2.2 工具提示保留时长 toolTipDuration()
14.3 WhatsThis提示
- 当鼠标处于问号状态时,点击该控件显示指定提示信息
首先我们需要设置一个带问号的窗口,设置Flag:Qt.WindowContextHelpButtonHint
14.3.1 设置 setWhatsThis()
14.3.2 获取 whatsThis()
15 焦点控制
焦点状态
在此界面中,我们可以选择输入账号或密码
如果正在输入账号,则账号的输入栏为焦点状态,如果正在输入密码,则密码的输入栏为焦点状态。
15.1 单个控件角度
创建三个输入栏
可以看出默认的焦点为le1
也就是说最早创建的控件处于焦点的第一优先级
15.1.1 指定控件获取焦点 setFocus()
焦点现已默认到le2
15.1.2 设置焦点获取策略 setFocusPolicy(Policy)
Policy:
- Qt.TabFocus:只能通过Tab获得焦点
- Qt.ClickFocus:只能通过被单击获得焦点
- Qt.StrongFocus:可通过上面两种方式获得焦点
- Qt.NoFocus:不能通过以上两种方式获得焦点,只能通过代码中的setFocus来获取焦点
使用方式
可以使用Tab获取焦点,但是鼠标点击却无效
15.1.3 取消焦点 clearFocus()
- 目前没发现有什么用
运行后我们发现焦点依然在le1上
15.2 父控件角度
15.2.1 获取子控件中当前聚焦的控件 focusWidget()
运行结果
说明在在自动获取焦点状态下第一轮中显示中,window的子控件没有获取到焦点,此时我们使用鼠标事件确认焦点
此时发现有一个QLineEdit获取了焦点
15.2.2 聚焦下一个子控件 focusNextChild()
此方法配合鼠标按下事件效果也比较明显
此时我们发现每点击一次鼠标,焦点就会发生改变
- 这个和在APP上输入验证码的功能很像,当我输入完第一个数字后,焦点自动跳到下一位置
15.2.3 聚焦上一个子控件 focusPreviousChild()
与上面的方法功能相似,这个会往上面跳
15.2.4 通过布尔量控制聚焦上一个/下一个控制focusNextPrevChild(bool)
- True为上一个,False为下一个
这两个方法亲测有效
15.2.5 设置子控件获取焦点的先后顺序 setTabOrder(pre_widget,next_widget)
这个属于静态方法,直接使用类名调用
经测试获取焦点的顺序为1 → 3 → 2
如果不加这个语句的莫获取焦点的顺序为1 → 2 → 3
也可以实例化后调用实例对象
测试后效果相同