Qt常用事件汇总

Qt之单次定时器 Qt之单次定时器概述:代码示例:实现一实现二实现三over:文末一句话: 概述: 1. 下面我们用三种实现方式吧,来实现定时器的单次触发; 代码示例: 实现一 使用QTimer的 setSingleShot 接口实现单次定时器。 QTimer *pTimer = new QTimer(this); connect(pTimer,SIGNAL(timeout()),this,SLOT(slot_Timerout())); pTimer->setSingleShot(true) 阅读详情

一个事件由一个特定的 QEvent 子类来表示,但是有时一个事件又包含多个事件类型,比如鼠标事件又可以分为鼠标按下、双击和移动等多种操作。这些事件类型都由 QEvent 类的枚举型 QEvent::Type 来表示,其中包含了 一百多种事件类型,可以在 QEvent 类的帮助文档中查看。虽然 QEvent 的子类可以表示一个事件,但是却不能用来处理事件,那么应该怎样来处理一个事件呢?在 QCoreApplication 类的notify()函数的帮助文档处给出了5种处理事件的方法:

方法一:重新实现部件的 paintEvent()、mousePressEvent() 等事件处理函数。这是最常用的一种方法,不过它只能用来处理特定部件的特定事件。

方法二:重新实现 notify() 函数。这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。但是,它一次只能处理一个事件。

方法三:向 QApplication 对象上安装事件过滤器。因为一个程序只有一个 QApplication 对象,所以这样实现的功能与使用 notify() 函数是相同的,优点是可以同时处理多个事件。

方法四:重新实现 event() 函数。QObject 类的 event() 函数可以在事件到达默认的事件处理函数之前获得该事件。

方法五:在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。

在实际编程中,最常用的是方法一,其次是方法五。因为方法二需要继承自 QApplication 类;而方法三要使用一个全局的事件过滤器,这将减缓事件的传递,所以,虽然这两种方法功能很强大,但是却很少被用到。

------>>>>>>鼠标单击 移动 释放 与滚动事件
#include<QMouseEvent>
#include<QWheelEvent>

protected:
    void wheelEvent(QWheelEvent *e);
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);

void wheelEvent(QWheelEvent *e)
{
    if (e->delta() > 0) //鼠标向上滚动
    {
        ui->textEdit->zoomIn(); //进行放大,textEdit的光标和字体都放大
    }
    else
    {
        ui->textEdit-zoomOut(); //进行缩小,textEdit的光标和字体都缩小
    }
}

void mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
    {
        qDebug() << "左键按下";
    }
    else if (e->button() == Qt::RightButton)
    {
        qDebug() << "右键按下";
    }
    
      qDebug() << "Press:" << event->x() << " " << event->y();
}

//只有鼠标按下后移动鼠标才会产生mouseMove事件
void mouseMoveEvent(QMouseEvent *e)
{
        if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键移动" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键移动" ;
    }

    //获取移动过程中的鼠标指针坐标
    qDebug() << "move:" << event->x() << " " << event->y();
}

void mouseReleaseEvent(QMouseEvent *e)
{
        if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键释放" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键释放" ;
    }

    //获取释放时的鼠标指针坐标
    qDebug() << "release:" << event->x() << " " << event->y();
}

----->>>>>>拖拽事件
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QUrl>

protected:
    void dragEnterEvent(QDragEnterEvent *e);
    void dropEvent(QdropEvent *e);


this->setAcceptDrops(true); //接收拖拽事件

void dragEnterEvent(QDragEnterEvent *e)
{
    if (e->mineData()->hasUrls())
        e->acceptProsedAction();
    else
        e->ignore();
}    

void dropEvent(QdropEvent *e)
{
    const QMimeData *mimeData = event->mimeData(); //获取MIME数据
    if (mimeData->hasUrls()){
        QList<QUrl> urlList = mimeData->urls(); //获取url列表
        QString fileName = urlList.at(0).toLocalFile();
        if (!fileName.isEmpty()){
            QFile file(fileName);
            if(!file.open(QIODevice::ReadOnly))
                return
                
            QTextStream in(&file);
            ui->textEdit()->setText(in.readAll());        
        }
    }
}
----->>>>>>键盘事件
#include <QKeyEvent>

protected:
    void keyPressEvent(QkeyEvent *e);
    void keyReleaseEvent(QKeyEvent *e);

void keyPressEvent(QkeyEvent *e)
{
    switch(e->key())
    {
    case Qt::key_Escape:
        qDebug() << "Esc";
        break;
    case Qt::key_Return
        qDebug() << "Enter";
        break;
    default:
        break;    
    }
    
    
    if (e->modifiers() == Qt::ControlModifier)
    {
        //如果是,那么再检测M键是否按下
        if(event->key() == Qt::Key_M)
        {
            //按下则使窗口最大化
            this->setWindowState(Qt::WindowMaximized);
        }
    }
}

void keyReleaseEvent(QKeyEvent *e)
{
    if (e->key() == Qt::keyUp)
    {
        qDebug() << "Release: " << "Up";
    }
}
----->>>>>>定时器事件
如果想让定时器仅仅执行一次, 可以使用 setSingleShot(bool singleShot);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer->setSingleShot(true);
timer->start(2000);

自定义非阻塞的延时功能
QCoreApplication::processEvents();
QEventLoop loop;//定义一个新的事件循环
QTimer::singleShot(2000, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();

protected:
    void timerEvent(QTimerEvent *e);

id1 = startTimer(1000); 
id2 = startTimer(2000);
id3 = startTimer(3000);    
void timerEvent(QTimerEvent *e)
{
    if (e->timerId() == id1)
    {
        qDebug() << "定时器1超时"
    }
    else if (e->timerId() == id2)
    {
        qDebug() << "定时器2超时"
    }
    else if (e->timerId() == id3)
    {
        qDebug() << "定时器3超时"
    }
}

主动发送事件函数:sendEvent()与PostEvent()
sendEvent()立即处理给定的事件, 不需要放入事件队列中,其QEvent对象参数在事件发送完成后无法自动删除,故需要在栈上创建QEvent对象
postEvent()将事件放入等待调度队列中,等待下一次事件循环处理,其QEvent对象参数在事件发送后队列会自动删除,故需要在堆上创建QEvent对象


    

深入理解QTimer::singleShot的参数,及使用时需要注意的点 singleShot有很多重载函数,各有自己的使用场景,使用不当,容易导致奔溃或者达不到预期。 1、时间精度: 查看源码可知,调用的时候若没有传入Qt::TimerType参数,则设置的超时时间小于等于2000ms时,使用精度更高的时钟类型:Qt::PreciseTimer,否则使用精度次高的Qt::CoarseTimer。 2、不恰当使用lambda表达式导致奔溃 如下为singleShot使用lambda的两种常用方式,区别在于第二个参数,为了访问类成员,lambda都捕获this指 阅读详情

相关推荐

Qt-事件总结

我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt框架内部为我们提供了一些事件处理机制,当窗口事件产生之后,事件会经过:事件派发(Qt应用程序对象发送的)—>事件过滤—>事件分发—>事件处理几个阶段。每一个Qt应用程序都对应一个唯一的QApplication应用程序对象,然后调用这个对象的exec()函数,这样Qt框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

qq_37464701的博客 1973

Qt 定时器之 singleShot 用法

[static] void QTimer::singleShot(int msec, const QObject *receiver, const char *member) 这个静态函数在一个给定时间间隔 msec(毫秒) 之后调用一个槽。 用法1 : 假设类A有个槽函数 function() { } 我们要在10s之后执行它 就可以: QTimer:...

风云的的博客 4万+

Qt事件处理汇总

QT事件产生后会被立即发送到相应的QWidget对象相应的QWidget中的event(QEvent *)进行事件处理event(QEvent *)根据事件类型调用不同的事件处理函数在事件处理函数中发送QT预定义的信号调用信号关联的槽函数public:protected:elseMain.cpp编译运行程序,鼠标点击按钮后打印出“Left press”字符串,没有打印出“child clicked”字符串。

qq_31286321的博客 1770

QT QTimer

QTimer是 Qt 提供的一个实现定时器的定时功能的类;QTimer还提供了一个简单的只有一次定时的函数singleShot()。一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。}{}{}{}

q610098308的专栏 2608

Qt事件系统:键盘事件

QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。QKeyEvent 的 key() 函数可以获取具体的按键,对于 Qt 中给定的所有按键,可以在帮助中查看 Qt: :Key 关键字。需要特别说明的是,回车键在这里是 Qt::Key_Return;

QtCompany的博客 3945

QT事件循环

文章目录一、QT消息/事件循环机制二、两个问题1.Qt是事件驱动的,怎么理解这句话2.Qt事件由谁产生的?Qt是如何将信号转换成事件的 一、QT消息/事件循环机制 Qt作为一个可视化GUI界面操作系统,是基于事件驱动的,我们程序执行的顺序不再是线性的,而是由一个个应用程序内部或外部的事件进行驱动的,无事件时便阻塞。这个有点类似于while循环,函数体内不断处理用户的输入,类比到事件循环中,用户点击了鼠标,按下了键盘,便称为事件。 一般对于带UI窗口的程序来说,“事件”是由操作系统或程序框架在不同的时刻发出的

qq_44991159的博客 4693

【QT】Qt事件

有关于Qt系统的相关内容~

s_little_monster的博客 9283

QT——事件

mousePressEvent(鼠标按下事件)、mouseReleaseEvent(鼠标释放事件)、mouseMoveEvent(鼠标移动事件)、mouseDoubleClickEvent(鼠标双击事件)等。所有事件,只能在主窗口中被捕获,子窗口无法自动捕获事件(排除焦点在子窗口身上的时候,之后再说这个问题) 这个时候,就要将事件从主窗口派发给子窗口 但是事件派发这个事情,要么一个不派发,要派发就所有事件一起派发,所以子窗口就需要写一个事件过滤器,将自己不需要的事件过滤掉,只留下自己需要的事件。

鲸落博客 1656

QT中的事件

1、QT事件 1.1、事件介绍 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。在Qt中使用一个对象来表示一个事件,它继承自QEvent类。 常见事件:鼠标事件、键盘事件、定时事件、上下文菜单事件、关闭事件、拖放事件、绘制事件。 1.2、事件的处理 重载相关的Event函数 重新实现事件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用也的一种方法,不过它只能用来处理特定部件的特定事件。例如实现拖放操作,就是用的...

qq_54395977的博客 7195

Qt面试题汇总

主要介绍Qt的面试题

m0_73139998的博客 1520

QTimer::singleShot()函数使用

当我们使用时,定时器将在指定的毫秒数后激活,然后执行指定的槽函数或者回调函数。这是一种在事件驱动的程序中实现简单延时执行功能的便捷方式。记得要在使用之前启动我们的 Qt 应用程序的事件循环,通常是通过调用来完成的,因为定时器依赖于事件循环来跟踪时间和调度事件。

程序猿老樊的博客 6万+

QT常用事件

鼠标事件(QMouseEvent),如点击、移动、释放等。键盘事件(QKeyEvent),如按键按下和释放。窗口事件(QResizeEvent, QMoveEvent),当窗口大小或位置改变时。绘制事件(QPaintEvent),需要重新绘制部分或全部窗口时。定时器事件(QTimerEvent),定时器超时时。拖放事件(QDragEnterEvent, QDropEvent),进行拖放操作时。焦点事件(QFocusEvent),当部件获得或失去键盘焦点时。

m晴朗的博客 2259

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3864

【Qt】事件

本文详细介绍了Qt中的事件处理机制,包括事件的类型、处理方法(如重写事件函数、使用事件过滤器等),以及如何通过事件实现各种交互功能。

You build it, you run it 1514

直线型一阶倒立摆1---从理论到实践的桥梁

本文深入探讨了直线型一阶倒立摆在控制理论中的核心地位,从非线性控制、鲁棒性到实时反馈等关键问题。通过实际案例和硬件搭建指南,帮助读者理解从理论到实践的过渡,特别适合控制工程初学者和研究人员。文章还提供了算法选型建议和硬件避坑手册,是掌握倒立摆控制的实用指南。

weixin_29047545的博客 319

变色龙哈希函数 Chameleon Hash 可变型区块链

哈希函数 Hash: 众所周知,区块链有着极其优秀的安全性就是因为其充分使用了哈希函数。 哈希简单用一句话来讲,就是:将任意长度输入的字串可转换成一个固定长度的字串,通过原始字串可以很容易地算出转换后的字串,通过转换后的字串很难还原出原始字串。 哈希函数特征: 1. 对于任意m作为输入,得到输出的结果,很难找到另一个输入m'  (m'不等于m),使得m'的Hash结果也为同样的输出

新手村 1万+

QT跨平台应用程序开发框架(6)—— 常用显示类控件

但是上面我们对 Label 尺寸的设置是“一次性”的,就上面的程序而言,只要我们扩大或缩小窗口大小,里面的 Label控件大小是不会变的,所以下面我们让 Label 的大小随着窗口大小实时发生改变。这个和 HTML 前端中一样的,有时候按钮旁边会有一些字,但是为了方便用户点击,一般用户直接点击按钮的旁边的文字也可以选中按钮,所以这个设置伙伴就是将文本和按钮“绑定”我们先使用 QLCDNumber 显示一个初始的数值,比如4,然后程序启动后,每过一秒数字就 -1,直到 0 就结束。

aaqq800520的博客 1554

一张图看懂 ABAP CDS 两大子语言:CDS DDL 与 CDS DCL 以及缺席的 DML

ABAP CDS 的核心设计思想围绕语义数据模型(DDL)与数据访问控制(DCL)展开,而非单纯作为SQL查询工具。其DDL通过声明式语法定义业务导向的数据视图,强调模型稳定性与复用性;DCL则将访问控制逻辑下沉到模型层,实现行级权限过滤。ABAP CDS刻意剥离DML功能,交由ABAP SQL处理数据变更,形成清晰的分层架构。这种设计使数据定义、访问控制与应用逻辑解耦,为现代ABAP应用提供更安全、可维护的数据治理方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 976

Qt常用事件以及绘图

Qt常用事件以及绘图 1.Qt事件处理函数的原理 2.Qt常用事件处理函数的使用 3.Qt绘图 1.Qt事件处理函数的原理 1.1什么是事件 事件是各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。Qt是使用一个对象来表示一个事件,继承自QEvent类。 也可以说Qt的事件就是响应我们的各种行为或者动作的情况。 1.2事件处理的过程 1.Qt先通过QApplication::e...

mubowen666的博客 3203

【Flink】Flink 消费一段时间1万多条数据就卡死

我们有个现场环境,发现了奇怪的现象,就是每次启动任务后,消费1万多条数据后就会卡死,然后整个流不消费,也不往下输出,看起来卡死了一样。缺图这里面出现的网闸原因导致的,但是经过我们写了一个简单的kafka消费程序,然后在出问题的节点上消费数据,实际排查,发现不是这个问题。这个问题,发现也不是,这段时间没有进行过kafka数据清理。里面的问题。因为这个问题,我们后面的代码刻意规范了,不这样操作。后来是在没办法了,然后我们dump了线程,发现有如下代码。

九师兄 351

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+

QT跨平台应用程序开发框架(4)—— 常用控件QWidget

有时候 Qt 内置的光标可能满足不了我们的需求,所以 Qt 也允许我们通过自定义图片的方式来设置光标//设置图标//设置窗口的图标//当我们点击时,是图片左上角在进行点击//假设我在按钮的边缘位置进行点击,但由于光标图片的左上角到按钮外面去了导致点击不到//所以我们可以设置实际点击在图片光标里的位置,10,10表示点击实际生效的位置,左上角是0,0如果导入的图片太大,我们也而已通过下面的API对图片进行缩放:iconfont-阿里巴巴矢量图标库。

aaqq800520的博客 1570

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 在线蒸馏 (附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv11的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了,本文内容为在线蒸馏教程,之前的文章为离线蒸馏!

Snu77的博客 2667

Qt控件和事件_qt按钮事件

Qt 控件又称组件或者部件,指用户看到的所有可视化界面以及界面中的各个元素,比如按钮、文本框、输入框等。为了方便程序员开发,Qt 提供了很多现成的控件。打开某个带 ui 文件的 Qt Widgets Application 项目,ui 文件的 Widget Box 一栏展示了 Qt 提供的几乎所有控件:图 1 Qt 提供的控件Qt 中的每个控件都由特定的类表示,每个控件类都包含一些常用的属性和方法,所有的控件类都直接或者间接继承自 QWidget 类。

2401_87019231的博客 1150

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

QT跨平台应用程序开发框架(5)—— 常用按钮控件

QPushButton 表示一个按钮,我们前面使用过很多次,继承自 QAbstractButton,这个类是一个抽象类,是其他按钮的父类,如下图:c++面向对象三大特性——多态_c++三大特性实例-优快云博客是一个包含纯虚函数的类,无法创建出实例,仅仅是为了被派生类继承并且派生类继承后后也不能实例化出对象。只有重写虚函数派生类才能实例化出对象属性说明text按钮中的文本icon按钮中的图标iconSize按钮中图标的尺寸shortCut按钮对应的快捷键autoRepeat。

aaqq800520的博客 1335

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: sqlite3:深入理解sqlite3_stmt 机制
下一篇: 互联网协议入门
奋斗Andy
博客等级 码龄11年 111粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值