Qt事件与信号(一)——重新实现事件处理器

【QT】QT的事件机制及其与信号机制的区别 一般有下列5种方式可以用来处理和过滤事件,每种方式都有其使用条件和使用范围。 阅读详情

目录

前言

Qt中事件应该是非常重要的一部分,对于重要的部分,记录下来!对于不经常用的,用到的时候再说!
学习!分享!感谢!

事件和信号

本部分参考一去二三里,引用如下:

在Qt中,事件就是对象,派生自QEvent抽象类,用来表示在应用程序中发生的事件,或是应用程序需要处理的外部活动产生的事件。也就是用户操作可以产生事件,系统自身也可以产生事件。

1
事件如下:
2
有一些事件对应有信号,可以用信号与槽的方式处理,也可以直接处理事件。但是有些事件。比如:paintEvent和timerEvent,我们就只能自己编程进行处理了。

使用信号与槽的方式

从上图可以知道,鼠标、键盘的按下都可以看作是发出clicked信号,所以我们可以对这类事件采用信号与槽的方式进行处理。
- main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}
  • dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "sibutton.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    siButton* sibutton;
private slots:
    void siButtonClicked();
};

#endif // DIALOG_H
  • dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"

#include <QtWidgets>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    sibutton = new siButton;
    sibutton->setText(tr("Hello"));

    connect(sibutton, SIGNAL(clicked()), this, SLOT(siButtonClicked()));

    ui->horizontalLayout->addWidget(sibutton);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::siButtonClicked()
{
    QMessageBox::information(this, tr("Test"), tr("Hello Signal and slots"));
}

使用信号与槽的方式,是在界面中对程序进行处理,也就是button只是作为一个对象,点击的事件应该是被界面接收,然后在界面中进行处理。

重新实现事件处理器

  • sibutton.h
#ifndef SIBUTTON_H
#define SIBUTTON_H

#include <QPushButton>

class siButton : public QPushButton
{
public:
    siButton();
protected:
    void keyPressEvent(QKeyEvent*);
};

#endif // SIBUTTON_H
  • sibutton.cpp
#include "sibutton.h"
#include <QtWidgets>   

siButton::siButton()
{

}

void siButton::keyPressEvent(QKeyEvent *)
{
    QMessageBox::information(this, tr("Test"), tr("Hello, keyPressEvent"));
}

使用事件处理的方式,是在继承QPushButton的文件中对点击事件进行处理,我认为也就是在siButton这个控件中对键盘按下事件进行处理。

重新实现paintEvent函数对事件进行处理

  • dialog2.h
#ifndef DIALOG2_H
#define DIALOG2_H

#include <QDialog>
#include "siWidget.h"

namespace Ui {
class Dialog2;
}

class Dialog2 : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog2(QWidget *parent = 0);
    ~Dialog2();

private:
    Ui::Dialog2 *ui;

private:
    siWidget *siwidget;

};

#endif // DIALOG2_H
  • dialog2.cpp
#include "dialog2.h"
#include "ui_dialog2.h"

Dialog2::Dialog2(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog2)
{
    ui->setupUi(this);

    siwidget = new siWidget;
    ui->horizontalLayout->addWidget(siwidget);

    this->resize(800, 600);
}

Dialog2::~Dialog2()
{
    delete ui;
}
  • siwidget.h
#ifndef SIWIDGET_H
#define SIWIDGET_H

#include <QWidget>
#include <QPaintEvent>

class siWidget : public QWidget
{
    Q_OBJECT

public:
    explicit siWidget(QWidget *parent = 0);

signals:

public slots:

protected:
    void paintEvent(QPaintEvent*);

};

#endif // SIWIDGET_H
  • siwidget.cpp
#include "siwidget.h"
#include <QtWidgets>

siWidget::siWidget(QWidget *parent):
    QWidget(parent)
{
    update();
}

void siWidget::paintEvent(QPaintEvent* )
{
    QPainter painter(this);

    QPixmap pix;
    pix.load("images/0.bmp");  // note: this should be with elf file

    painter.drawPixmap(0, 0, pix);
}

因为这个程序中用到了0.bmp,这时候如果没有时候资源文件(好像也没法使用资源文件),我们的文件就必须和可执行程序放在一起。

总结

程序很简单!本来感慨了一下!但是浏览器突然崩溃了!然后保存的都木有了!我明明保存了!上帝有派ZZ来考验我!气!!!

QT 事件和信号  仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可。但有一项区别在于,事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在QT中,事件处理函数如果返回true,则这个事件处理已完成,QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下 阅读详情

相关推荐

Qt学习笔记(三)事件处理

事件处理 1、事件 事件是由窗口或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者键盘或者鼠标按钮时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件,用来告知窗口需要重新绘制它本身,从而使窗口可见。大多数事件是作为用户动作的响应而产生的,但是也有一些例外,比如定时器事件,则是由系统产生的。 在使用Qt进行编程开发时,基本不需要考虑事件,因为在发生某

Crazy Tortoise 9956

Pyside6 QMenuBar

Pyside6 QMenuBar类提供了一个水平菜单栏,更多关于QMenuBar的使用可以参考下面的文档。

hwx1546的博客 1452

QT父子窗口事件传递与事件过滤器

处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现了事件方法,就直接处理掉事件了,没有进到MainWidget的处理方法中去,如果子Widget没有accept或ignore该事件,则该事件就会被传递给其父亲,在子Widget存在accept或ignore事件的时候,想要经过一下MainWidget的处理方法,就得用到事件处理器,因此网上找了一下,发现QT的事

QtCompany的博客 1378

Qt5中qDebug信息不输出的解决方法

Qt5中默认不输出qDebug的调试信息,本文说明了如何修改配置达到输出调试信息的目的。

muren的专栏 1万+

【Qt】Qt多线程开发—实现多线程设计的四种方法

Qt—使用Qt实现多线程设计的四种方法 一、写在前面 ​ 这篇文章内容是:关于Qt多线程应用设计,在Qt中提供了四种方法来进行多线程编程和设计。合理的选择对应的方法来解决实际开发中遇到的开发问题有助于对应用程序进行更合理设计。 文章目录Qt—使用Qt实现多线程设计的四种方法一、写在前面二、【方法一】 QThread:带有可选事件循环的底层API三、【方法二】 QThreadPool和QRunnable:重用线程四、【方法三 】Qt并发:使用高级API五、【方法四】 WorkerScript:QML中的线程化

iriczhao的博客 1万+

PCIE6.0协议学习小记-Flit_Mode

PCIE6.0学习

code_aJack的博客 4642

Qt事件处理机制(二)重写事件处理函数:重写鼠标移动事件,实现用鼠标拖动按钮在widget中自由移动!

重写事件处理函数:重写鼠标移动事件,实现用鼠标拖动按钮在widget中自由移动!

qq_40876689的博客 3584

[官方培训]19-物理模拟 Epic 肖月 笔记

物理引擎全局解算精度的设置,帧率越高,子步越多得到的模拟结果就越精确。引擎默认情况下是以变化的帧率运行的,但是对于Chaos物理引擎来说。一般子步越小,帧率越固定,效果就会更好更稳定一些。图示的分步选项就是依据下方的最长子步时长和最大步数对动态变化的帧率,进一步的做拆分来保证物理效果。对于影视项目建议都开启分步选项。红色框内有三个迭代次数的设置,这是Chaos基于位置的约束求解算法专用的一个设置,可以简单理解为迭代次数越高,当前帧一个子步内得到的结果就越精确。

Tcohneyn的博客 1546

Qt中信号和槽的连接方式详解(多线程)

Qt中五种不同的信号和槽连接方式在多线程环境下的应用非常重要。根据不同的需求和场景,选择合适的连接方式能够保证程序的高效运行和数据的安全处理。 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection

weixin_43672168的博客 3613

Qt for Android:基于libusb实现CH340x串口通信的高效开发方案

本文详细介绍了在Qt for Android环境下,基于libusb实现CH340x串口通信的高效开发方案。通过绕过Android高版本系统的权限限制,利用libusb+JNI技术实现稳定通信,适用于工业手持终端等场景。文章涵盖环境搭建、核心实现、常见问题解决方案及性能调优经验,帮助开发者快速掌握这一关键技术。

weixin_42715608的博客 427

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

QT事件与信号之间的关系

总结:事件是操作系统时,一种触发操作后的结果。事件产生,大部分由硬件进行触发。如(鼠标的移动、按压、双击。键盘的键入等)。小部分由软件触发(如应用程序内容发送事件类型给操作系统执行相应功能)

caiji667788的博客 1001

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

【Qt】事件

事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在Qt中使⽤⼀个对象来表⽰⼀个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本⾝在不同的时刻发出的。当⽤⼾按 下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在⽤⼾ 操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常见的Qt事件如下:这些子类里面包含了比较常见的事件可以看到,非常丰富啊!!

2301_80224556的博客 914

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1590

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1633

3.1Qt事件之事件处理器

基于Qt提供的事件处理器函数,我们可以非常轻松地按照自己的想法制作出一个按钮,按钮的要求如下:从视觉上看是一个不规则按钮(按钮实际上都是矩形的)1.按钮上需要显示指定的背景图片2.按钮在鼠标的不同操作阶段(无操作、鼠标悬停、鼠标按下)能够显示不同的背景图。

丰锋的博客 178

uv pip install时出现error: Request failed after 3 retries 解决方案

本文主要介绍了uv pip install时出现error: Request failed after 3 retries解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方法一 2.2 方法二

weixin_43178406的博客 12万+

Qt中的事件模型

Qt的事件模型 1.事件的概念         应用程序对象将系统消息接收为 Qt 事件。应用程序可以按照不同的粒度对事件加以监控、过滤并做出响应。     在 Qt 中,事件是指从 QEvent继承 的对象。Qt将事件发送给每个QObject对象,这样对象便可对事件做出响

qter_wd007的专栏 7611

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Qt事件循环及QEventLoop的使用

一、 Qt的事件循环 Qt作为一个跨平台的UI框架,其事件循环实现原理, 就是把不同平台的事件循环进行了封装,并提供统一的抽象接口。和Qt做了类似工作的,还有glfw、SDL等等很多开源库。 二、QEventLoop类 QEventLoop即Qt中的事件循环类,主要接口如下: int exec(QEventLoop::ProcessEventsFlags flags = AllEvents) void exit(int returnCode = 0) bool isRunning...

kupePoem的专栏 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Qt中的事件处理机制(event)

Qt事件也就是Qt程序中出现的一系列“事情”,包括对用户操作做出反应时发出的鼠标或键盘事件等;以及系统内部自动发出的定时器事件等。总之,出现了这些事件后就需要对这些事件进行处理,处理的方法便是“事件处理机制”。 图1 Qt事件产生 以用户操作事件为例,其事件处理过程如下图。 图2 Qt事件处理过程 上述过程通过操作系统和Qt平台的处理,将用户具体的一个操作指令(如鼠标点击)转化为一个Q...

从0开始学编程 4276

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Qt事件处理

事件是用户和应用软件间产生的一个交互操作,由用户操作产生或者系统内部产生,通过事件循环对事件进行处理,事件也可以用来在对象间进行信息交互。. Qt平台会将系统产生的消息转换为Qt事件 .Qt事件是一个QEvent的对象 .Qt事件用来描述程序内部或外部发生的动作·任意的QObject对象都具备事件处理的能力·键盘事件:按键按下或松开 ·鼠标事件:鼠标移动。鼠标按键的按下和松开·拖放事件:用鼠标进行拖放 ·滚轮事件:鼠标滚轮滚动 ·绘屏事件:重绘屏幕的某些部分·

weixin_62789590的博客 915

python qt5 数据改变 触发信号_PyQt5教程(四)——事件与信号

在这部分教程中我们将探讨在程序内部发生的事件与信号。事件所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式:例如网络连接、window manager或定时器。当我们调用QApplication的exec_()方法时会使程序进入主循环。主循环会获取并分发事件。在事件模型中有三个参与者:事件源事件(对象)事件接收者事件源是状态发生变化的对象。它会生成事件。事件(对象)封装了事...

weixin_39840635的博客 345

Qt -- 事件

一、什么是事件 事件是由程序内部或者外部产生的某种动作,比如用户按下键盘或者鼠标,产生一个键盘事件或者鼠标事件(程序外部产生)。比如产生一个绘制的事件,需要通过窗口重新绘制其自身(程序内部产生)。 二、为什么要用事件? 事件的出现,使得程序代码不会按照之前的线性的顺序执行,事件处理的是复杂的用户交互。 三、信号和事件的区别? 信号是对象产生的,而事件既可以同步使用,也可以异步使用。 ...

xuechanba的博客 335

Qt的事件模型

Qt的事件 事件和信号与槽的不同: signal and slots 是Qt自己设计的机制之一,但是事件是更底层的,被普遍开发框架接受的机制之一。建议的是,表面 / 界面使用信号与槽,更深层使用事件。 事件的来源: 事件是窗口系统或者Qt对不同的情况的响应。主要来源就是两个: ——是对用户行为的被动响应,比如按下鼠标之类; ——被系统独立产生的,比如是定时器事件。 或者可以这么说, ——Spont...

qq_38181811的博客 914
上一篇: linux下通过V4L2驱动USB摄像头
下一篇: Qt事件处理(二)——事件处理链
simonXi-tech
博客等级 码龄10年 398粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值