90-事件与事件的处理函数-窗口和控件的常用事件

窗口和控件的常用事件

窗口和控件的常用事件包括窗口或控件的隐藏、显示、移动、缩放、重绘、关闭、获得和失去焦点等,通常需要重写这些事件的处理函数,以便达到特定的目的。

显示事件QShowEvent和隐藏事件QHideEvent

在用show()方法或 setVisible(True)方法显示一个顶层窗口之前会发生 QEvent.Show事件调用showEvent(QShowEvent)处理函数,显示事件类 QShowEvent 只有从QEvent 继承的属性没有自已特有的属性。

在用hide()方法或 setVisible(False)方法隐藏一个顶层窗口之前会发生 QEvent.Hide 事件调用hideEvent(QHideEvent)处理函数,隐藏事件类QHideEvent 只有从 QEvent 继承的属性,没有自已特有的属性。利用显示和隐藏事件的处理函数,可以在窗口显示之前或被隐藏之前做一些预处理工作。

缩放事件QResizeEvent和移动事件QMoveEvent

当一个窗口或控件的宽度和高度发生改变时会触发 QEvent.Resize 事件,调用resizeEvent(QResizeEvent)处理函数。

缩放事件类QResizeEvent 只有两个方法oldSize()和 size(),分别返回缩放前和缩放后的窗口尺寸QSize

当改变一个窗口或控件的位置时会触发 QEvent,Move 事件,调用moveEvent(QMoveEvent)处理函数。

移动事件类QMoveEvent 只有两个方法oldPos()和 pos(),分别返回窗口左上角移动前和移动后的位置 QPoint。

绘制事件QPaintEvent

绘制事件QPaintEvent是窗体系统产生的在一个窗口首次显示隐藏后又显示缩放窗口移动控件,以及调用窗口的 update()repaint()resize()方法时都会发 QEvent.Paint事件。

绘制事件发生时,会调用paintEvent(QPaintEvent)处理函数该函数是受保护的,不能直接用代码调用,通常在 paintEvent(QPaintEvent)处理函数中处理一些与绘图显示有关的事情。

绘制事件类QPaintEvent 只有两个方法 rect()和 region()方法分别返回被重绘的矩形区域 QRect 和裁剪区域 QRegion。

进人事件和离开事件 QEnterEvent

当光标进入窗口时,会触发 QEvent,Enter 进人事件,进人事件的处理函数是enterEvent(QEnterEvent),QEnterEvent 的方法如表所示;

QEnterEvent的方法返回值的类型QEnterEvent的方法返回值的类型
clone()QEnterEventpos()QPoint
globalPos()QPointscreenPos()QPointF
globalX()intwindowPos()QPointF
globalY()intx()int
localPos()QPointFy()int

当光标离开窗口时,会触发QEvent,Leave 离开事件离开事件的处理函数是 leaveEvent(QEvent)。可以重写这两个函数,以达到特定的目的。

焦点事件 QFocusEvent

一个控件获得键盘焦点时,可以接受键盘的输人。控件获得键盘焦点的方法很多,例如按 Tab 键、鼠标、快捷键等。

  • 当一个控件获得和失去键盘输人焦点时,会触发 QEvent.FocusIn 和QEvent.FocusOut 事件,这两个事件的处理函数分别是 focusInEvent(QFocusEvent)和 focusOutEvent(QFocusEvent)
  • 焦点事件类QFocusEvent 的方法有getFocus()_lostFocus()和 reason()。
  • 事件类型 type()
    • 当事件类型 type()的值是 QEvent.FocusIn 时getFocus()方法的返回值是 True,
    • 当事件类型type()的值是QEvent.FocusOut 时lostFocus()方法的返回值是 True;
  • reason()方法返回获得焦点的原因其返回值的类型是Qt.FocusReason,其值 有:
    • Qt.MouseFocusReason
    • Qt.TabFocusReason
    • Qt.BacktabFocusReason
    • Qt.ActiveWindowFocusReason
    • Qt.PopupFocusReason
    • Qt.ShortcutFocusReason
    • Qt.MenuBarFocusReason
    • Qt.OtherFocusReason

关闭事件QCloseEvent

当用户单击窗口右上角的X按钮或执行窗口的 close()方法时,会触发 QEvent,Close事件,调用closeEvent(QCloseEvent)处理该事件。

如果事件用ignore()方法忽略了,则什么也不会发生;

如果事件用accept()方法接收了,首先窗口被隐藏,在窗口设置了setAttribute(Qt.WA_DeleteOnClose,True)属性的情况下,窗口会被删除。

窗口事件类QCloseEvent 没有特殊的属性,只有从 QEvent 继承来的方法。

定时器事件QTimerEvent

从QObject 类继承的窗口和控件都会有startTimer(int,timerType =Qt.CoarseTimer)方法和 killTimer(int)方法。

startTimer()方法会启动一个定时器,并返回定时器的 ID 号。

  • 如果不能启动定时器,则返回值是 0,参数 int 是定时器的事件间隔,单位是毫秒
  • timerType 是定时器的类型,可以取
    • Qt.PreciseTimer
    • Qt.CoarseTimer
    • Qt.VeryCoarseTimer。
  • 窗口或控件可以用startTimer()方法启动多个定时器,启动定时器后,会触发 timerEvent(QTimerEvent)事件,QTimerEvent是定时器事件类。
    • 用QTimerEvent的 timerId()方法可以获取触发定时器事件的定时器ID;
    • 用killTimer(int)方法可以停止定时器,参数是定时器的 ID。

下面的程序启动窗口上的两个定时器,这两个定时器的时间间隔不同,用定时器事件识别是哪个定时器触发了定时器事件,可用按钮停止定时器。

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/1 20:29
# File_name: demo.py

from PySide6.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout
from PySide6.QtCore import Qt
import sys


class MyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.ID_1 = self.startTimer(500,Qt.TimerType.PreciseTimer)# 创建第 1个定时器
        self.ID_2 = self.startTimer(1000,Qt.TimerType.CoarseTimer)# 创建第2个定时器

        btn_1 = QPushButton("停止第1个定时器",self)
        btn_2 = QPushButton("停止第2个定时器",self)
        btn_1.clicked.connect(self.killTimer_1)
        btn_2.clicked.connect(self.killTimer_2)

        h = QHBoxLayout(self)
        h.addWidget(btn_1)
        h.addWidget(btn_2)

    def timerEvent(self,event):  # 定时器事件
        print("我是第"+ str(event.timerId())+"个定时器")

    def killTimer_1(self):
        if self.ID_1:
            self.killTimer(self.ID_1)# 停止第1个定时器
            print(f"{'='* 20}第1个定时器停止{'='* 20}")

    def killTimer_2(self):
        if self.ID_2:
            self.killTimer(self.ID_2)# 停止第2个定时器
            print(f"{'='* 20}第2个定时器停止{'='* 20}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWidget()

    win.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
http://www.ntko.com--联机演示 NTKO Office文档控件是OA系统开发的最佳选择组件!支持强制痕迹保留,手写签名,电子印章,支持所有菜单,任意后台服务器等。 NTKO OFFICE文档控件是拥有完全自主知识产权的ActiveX控件。使用NTKO Office文档控件,能够在浏览器窗口中直接编辑Word,Excel等Office文档并保存到Web服务器。实现文档和电子表格的统一管理。同时支持痕迹保留,手写签名等办公自动化系统必备的功能。!卓越的性能,标准高效的编程接口,让您轻松创建极具特色的解决方案! 主要功能: ----------------------------------------------------- 1.支持所有的Office菜单 ; 2.支持强制痕迹保留,控件可以通过编程,让用户只能在痕迹保留状态下工作; 3.无需后台配置,即可支持Lotus Domino ,可与Lotus Domino服务器天然集成; 4. 基于标准协议,无任何自定义数据格式,通用性好 ; 5.广泛的操作系统,Web服务器和编程语言支持 后台支持Windows,Linux,Unix等各种操作系统;支持IIS,Domino,Websphere,Apache等所有后台服务器类型和JSP,ASP,PHP,PERL等编程语言。 6.支持手写签名和加密的电子印章 ; 7.支持从本地或服务器URL获取加密的电子印章 ; 8.支持从服务器URL或本地直接插入透明浮动图片到Word,Excel文档 ; 9.支持将手工绘制的图片作为透明浮动的图片增加到Word,Excel文档 ; 10.全面支持Office2000的打印预览 11. 轻量级,只有不足50K 使用C语言直接开发COM接口,简介高效,对内核函数的直接调用使得无需其它动态链接库的支持,兼容性极好; 12. 在下载和上载Office文档时不会产生临时文件 使用流数据作为Office文档的数据源,不会产生临时文件; 13. 能够禁止用户从文档拷贝数据; 14.支持简洁高效的编程接口 可使用Javascript和VBScript对控件进行编程。可以完全控制Office文档。 15.支持HTTP协议,HTTPS OVER SSL协议 对HTTPS协议的支持使得可以创建更加安全的应用。并且自动支持Session Cookie。使用当前页面的Session Cookie和服务器进行交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值