当前位置: 首页 > news >正文

QT的事件

在Qt中,事件(Event)是指由特定对象发生的动作或状态变化,这些事件可以由用户操作产生,如鼠标点击、键盘输入等,也可以由系统内部产生,如定时器超时、窗口大小改变等。

我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt框架内部为我们提供了一系列的事件处理机制,当窗口事件产生之后,事件会经过: 事件派发 -> 事件过滤->事件分发->事件处理 四个阶段。Qt窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作,比如信号与槽就是一种

每一个Qt应用程序都对应一个唯一的 QApplication 应用程序对象,然后调用这个对象的 exec() 函 数,这样Qt框架内部的事件检测就开始了( 程序将进入事件循环来监听应用程序的事件 )。 

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow* w = new MainWindow;
w.show();
return a.exec();
}

Qt默认的事件处理 

 事件在Qt中产生之后,的分发过程是这样的:

1. 当事件产生之后,Qt使用用应用程序对象调用 notify() 函数将事件发送到指定的窗口

[override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);

2. 事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤

// 需要先给窗口安装过滤器, 该事件才会触发
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

3. 当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类:

[override virtual protected] bool QWidget::event(QEvent *event);

4.事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件。。。)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函 数),比如:鼠标事件:

// 鼠标按下
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
// 鼠标释放
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
// 鼠标移动
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);

重写事件案例

如:关闭程序前会进行询问 

    void enterEvent(QEvent *event) override;void leaveEvent(QEvent *event) override;void closeEvent(QCloseEvent *event) override;
void MainWindow::enterEvent(QEvent *event)
{qDebug()<<"鼠标进入页面!";
}void MainWindow::leaveEvent(QEvent *event)
{qDebug()<<"鼠标离开页面!";
}
void MainWindow::closeEvent(QCloseEvent *event)
{int ret = QMessageBox::warning(this,"关闭","是否关闭窗口",QMessageBox::Ok | QMessageBox::No);switch (ret) {case QMessageBox::Ok:event->accept();break;case QMessageBox::No:event->ignore();break;}
}

 

 

 


http://www.mrgr.cn/news/54472.html

相关文章:

  • 更换镜像部署LNMP环境
  • 3.matplotlib基础及用法(全)
  • 【机器学习】VQ-VAE(Vector Quantized Variational Autoencoder)
  • 软件设计模式------概述
  • Java抽象类
  • smbms(2)
  • SpringBoot技术在汽车票预订领域的应用
  • 状态空间表达式的求解与转化【现代控制理论】
  • 第6天:Intent和页面导航
  • 管家婆财贸ERP BB007.销售订单明细批量采购
  • 大数据治理--技术平台与工具
  • 深入探索 APKTool:Android 应用的反编译与重打包工具
  • 2024软考网络工程师笔记 - 第12章.网络规划设计
  • 【软件运行类文档】项目试运行方案,试运行计划书(word原件)
  • Windows环境下安装jdk8,含配置环境变量全过程
  • 基于MATLAB车牌识别系统设计
  • mysql连接池简单原理介绍+高并发场景下的设计
  • 发动机拆解可视化:精细化呈现机械内部结构
  • 安装 Git
  • 二层交换机的工作原理与局域网设备通信详解
  • 瑞云快图云渲染怎么样?渲染一张图贵吗?
  • 图的最小生成树算法--普里姆(Prim)算法和克鲁斯克尔(Kruskal)算法
  • 软考(网工)——局域网和城域网
  • 软件分享 丨eSearch 截图软件
  • AndroidStudio实验报告——实验一、二
  • 【Java】泛型