Qt学习之路(19): 事件(event)

Qt/C++音视频开发19-vlc内核各种事件通知 文件长度变化=libvlc_MediaPlayerLengthChanged播放进度变化=libvlc_MediaPlayerTimeChanged音量大小变化=libvlc_MediaPlayerAudioVolume设置静音状态=libvlc_MediaPlayerMuted取消静音状态=libvlc_MediaPlayerUnmuted抓图信号通知=libvlc_MediaPlayerSnapshotTaken文件打开信号=libvlc_MediaPlayerOpening。 阅读详情
前面说了几个标准对话框,下面不打算继续说明一些组件的使用,因为这些使用很难讲完,很多东西都是与实际应用相关的。实际应用的复杂性决定了我们根本不可能把所有组件的所有使用方法都说明白。这次来说说Qt相对高级一点的特性:事件。
 
事件(event)是有系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
 
一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。这与其他的一些框架不同:在Swing中,你所要关心的是JButton的ActionListener这个点击事件。
 
Qt的事件很容易和信号槽混淆。这里简单的说明一下,signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。总的来说,如果我们 使用组件,我们关心的是信号槽;如果我们 自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。
 
还记得我们在main函数里面创建了一个QApplication对象,然后调用了它的exec()函数吗?其实,这个函数就是开始Qt的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt将创建一个事件对象。Qt的所有事件都继承于QEvent类。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。关于这一点,我们会在以后的章节中详细说明。
 
在所有组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、 mousePressEvent()、mouseReleaseEvent()等。这些函数都是protected virtual的,也就是说,我们应该在子类中重定义这些函数。下面来看一个例子。
 
#include <QApplication> 
#include <QWidget> 
#include <QLabel> 
#include <QMouseEvent> 
 
class EventLabel :  public QLabel 
{ 
 
protected: 
         void mouseMoveEvent(QMouseEvent * event); 
         void mousePressEvent(QMouseEvent * event); 
         void mouseReleaseEvent(QMouseEvent * event); 
}; 
 
void EventLabel::mouseMoveEvent(QMouseEvent * event) 
{ 
         this->setText(QString( "<center><h1>Move: (%1, %2)</h1></center>") 
                                               .arg(QString::number( event->x()), QString::number( event->y()))); 
} 
 
void EventLabel::mousePressEvent(QMouseEvent * event) 
{ 
         this->setText(QString( "<center><h1>Press: (%1, %2)</h1></center>") 
                                               .arg(QString::number( event->x()), QString::number( event->y()))); 
} 
 
void EventLabel::mouseReleaseEvent(QMouseEvent * event) 
{ 
        QString msg; 
        msg.sprintf( "<center><h1>Release: (%d, %d)</h1></center>", 
                                 event->x(),  event->y()); 
         this->setText(msg); 
} 
 
int main( int argc,  char *argv[]) 
{ 
        QApplication app(argc, argv); 
        EventLabel *label =  new EventLabel; 
        label->setWindowTitle( "MouseEvent Demo"); 
        label->resize(300, 200); 
        label->show(); 
         return app.exec(); 
}
 
这里我们继承了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数。我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。注意我们在mouseReleaseEvent函数里面有关QString的构造。我们没有使用arg参数的方式,而是使用C语言风格的sprintf来构造QString对象,如果你对C语法很熟悉(估计很多C+++程序员都会比较熟悉的吧),那么就可以在Qt中试试熟悉的C格式化写法啦!

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/223974

eventlistener-win:使用UIAutomation.h和Qt库创建的Windows事件侦听器 Windows事件监听器 用法: # include < QList> # include < QVariantMap> # include < QString> # include < QDebug> # include < wineventlistener> int main ( int argc, char *argv[]) { // to receive the event identified by the listener QVariantMap eventDetected; /* QList with all events to be identified * To know all suported events, see: * https://docs.microsoft.com/en-us/windows/wi 立即下载

相关推荐

在mdk文件移植太多_XCubeClassB代码 的移植

前言ST在www.st.com官网上提供了针对IEC60730/IEC60335 ClassB认证的软件包。软件包分为三个,分别适用STM8,STM32(基于标准外设库)和STM32(基于HAL库):STM8-SafeCLASSB,STM32-CLASSB-SPL,X-CUBE-CLASSB。本文以X-CUBE-CLASSB为例介绍如何做代码的移植以及经常遇到的问题的解决办法。X-CUB...

weixin_28898707的博客 1832

swing jbutton实现长按和点击事件

【代码】swing jbutton实现长按和点击事件。

xiaoerbuyu1233的博客 881

CMMI AIM 人工智能成熟度框架:31个过程域的157项AI实践集成

CMMI AIM人工智能成熟度框架为企业提供了系统化管理AI项目全生命周期的解决方案,包含31个过程域的157项AI实践。该框架通过四个演进阶段(混沌与风险、结构与凝聚、验证与信任、价值与增长),帮助组织建立可持续的AI能力成长路径,降低项目失败率并提升商业价值。

weixin_42613501的博客 351

Java Swing JButton绑定事件之lambda写法

《Java从入门到精通》(第5版)(明日科技)第255页,常用事件监听器部分写的太复杂了,绑定事件时还要专门写一个类,蛋疼!!!jetbrains idea推荐了lambda 写法。

苔原之家 928

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。

静谧、淡雅 644

[系统安全] 三十二.恶意代码检测(2)常用技术详解及总结

前文从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识,在学术界方面,用类似于综述来介绍攻击追踪溯源的不同方法;在产业界方面,主要参考李东宏老师从企业恶意样本分析的角度介绍溯源工作。这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。希望这篇文章对您有所帮助,如果文章中存在错误、理解不到位或侵权的地方,还请告知作者与海涵。且看且珍惜,加油~

杨秀璋的专栏 1万+

java界面放大按钮写死_java如何同时改变多个界面按钮上的文字颜色和大小

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;class Jframe extends JFrame {public Jframe() {add();button();}public void ad...

weixin_39575047的博客 272

银河麒麟桌面系统批量交付:封装自动化ISO镜像,百台装机效率提升10倍

麒麟桌面系统自动化ISO镜像定制摘要 本文详细介绍麒麟桌面版ISO安装镜像的定制方法,通过修改系统文件实现自动化安装部署。主要内容包括:1) 挂载原版ISO并提取文件;2) 使用unsquashfs解压系统文件进行定制化修改,包括添加系统标记配置;3) 配置ky-installer.cfg自动应答文件,设置安装参数如用户名、密码、分区方案等;4) 修改grub引导配置启用自动安装模式。该流程支持磁盘加密、自定义分区、自动登录等功能,生成的定制镜像可满足批量部署需求,显著提升系统安装效率。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 1506

JavaSwing学习日记(四)JButton(按钮)以及监听事件的创建

JavaSwing学习日记(四) JButton(按钮) 以及监听事件的创建 在日常的开发中,会经常的需要按钮为我们提交点击事件,在这里,我将会把JButton的使用方法写下来,以供后续使用 1、按钮的创建 //创建一个没有设置文本或图标的按钮。 JButton btn = new JButton(); //创建一个带有图标的按钮。 JButton btn = new JButton(Icon ...

qq_40492436的博客 3584

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3355

OceanBase容量统计:租户、数据库、表大小

🍎 数据库版本:OceanBase V4。

Sebastien23的博客 1400

Qt学习之路(19): 事件(event) - 豆子空间 - 51CTO技术博客

对于QT的事件机制讲解的很清楚,赞一个! 来源:http://devbean.blog.51cto.com/448512/223974#0-hi-1-64506-89fdc647f52c5196c0d5da60d38d89ea 转载于:https://www.cnblogs.com/farbeyond/p/5202922.html...

weixin_30418341的博客 98

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1230

Qt 事件处理机制-qt源码解读

在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生、分发、接受和处理事件。 本篇来介绍Qt 事件处理机制。深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集。 大家熟知Signals/Slots在多线程的实现也依赖于Qt的事件处理机制 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生、分发、接受和处理事件: 1、谁来产生事件: 最容易想到的是我们的输入设.

u011555996的博客 2092

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: Qt学习之路(18): Qt标准对话框之QInputDialog
下一篇: Qt学习之路(20): 事件接收与忽略
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值