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 立即下载

相关推荐

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 298

swing jbutton实现长按和点击事件

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

xiaoerbuyu1233的博客 881

奇异值分解(SVD)C++实现

奇异值分解SVD(紧奇异值分解,截断奇异值分解)C++实现

weixin_45804601的博客 4172

Java Swing JButton绑定事件之lambda写法

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

苔原之家 928

Python Selenium调用IE11报错全解析:从环境配置到稳定运行

在Web自动化测试领域,Selenium作为主流的跨浏览器测试框架,其核心原理是通过WebDriver协议与不同浏览器的驱动程序进行通信,实现对浏览器行为的模拟与控制。这一技术为软件测试的自动化、回归测试的效率提升提供了重要价值,广泛应用于金融、政务等对遗留系统兼容性要求高的行业场景。然而,当技术栈涉及过时的浏览器如IE11时,环境配置的复杂性显著增加,特别是Python与Selenium的组合常遭遇驱动兼容性、安全设置等挑战。本文聚焦于解决Python Selenium驱动IE11时的典型报错问题,深入剖

weixin_28834765的博客 322

stm32F103定时器使用方法

文章目录1、STM32的Timer简介2、普通定时器TIM2-TIM52.1 时钟来源2.2 计数器模式2.3 编程步骤3、程序源代码4、总结 1、STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟

weixin_43582209的博客 4515

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

RTCA DO-160G标准详解:航空电子设备的全面环境适应性测试指南

第二章的主要目的是提供标准中使用的术语和定义。了解这些术语对于准确理解标准的要求至关重要,特别是在技术实施过程中。RTCA DO-160G 涉及多个学科的知识,包括航空、电子、电磁学和机械工程,因此需要确保使用的术语在所有学科中具有一致的定义。为了确保测试人员和工程师在执行测试时对所有条件和要求的理解一致,RTCA DO-160G 标准中定义了大量术语。环境应力:指的是设备在操作过程中可能遇到的外部物理或化学条件,包括温度、湿度、振动等。电磁干扰(EMI)

qq_41854911的博客 5276

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

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

qq_40492436的博客 3584

LE AUDIO---Volume Control Service

LE AUDIO---Volume Control Service

weixin_42162924的博客 163

JavaFX Stage

JavaFXStagejavafx.stage.Stage表示 JavaFX 桌面应用程序中的窗口。在 JavaFX 内部,Stage您可以插入一个 JavaFX Scene,它表示在窗口内显示的内容 - 在Stage.当 JavaFX 应用程序启动时,它会创建一个根Stage对象,该对象将传递给 start(Stage primaryStage)JavaFX 应用程序的根类的方法。此Stage 对象代表 JavaFX 应用程序的主窗口。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 508

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

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 551

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

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

u011555996的博客 2092

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 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、付费专栏及课程。

余额充值