Qt+事件的接收和忽略
事件的接收与忽略的示意图如下图:
依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用accept()和ignore()函数,那就是窗口关闭的事件对于窗口关闭Qcloseevent事件,调用accept()意味着Qt会停止事件的传播,窗口关闭,调用ignore()则意味着事件继续传播,即阻止窗口关闭。
工程文件图,如下图:
ui界面图:
mybutton.h:
#ifndef MYBUTTON_H
#define MYBUTTON_H #include <QPushButton> class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = ); protected:
//重定义鼠标点击事件
void mousePressEvent(QMouseEvent *e); signals: public slots:
}; #endif // MYBUTTON_H
mywidget.h:
#ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget>
#include <QMouseEvent>
namespace Ui {
class MyWidget;
} class MyWidget : public QWidget
{
Q_OBJECT public:
explicit MyWidget(QWidget *parent = );
~MyWidget(); protected: //重写鼠标点击事件
void mousePressEvent(QMouseEvent *); //关闭事件
void closeEvent(QCloseEvent *event); private:
Ui::MyWidget *ui;
}; #endif // MYWIDGET_H
mybutton.cpp:
#include "mybutton.h" #include <QMouseEvent>
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{ }
void MyButton::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
//这里假设为信号的接收
//如果是左键按下
qDebug()<<"按下的是左键";
//事件接收后,就不会往下传递
e->ignore();//忽略,事件继续往下传递,那么给谁传递呢?
//事件传递给了父组件,不是给父类(基类)即MyButton,在这里就是传递给了 MyWidget ,为了验证到底是不是给了它,
//这里在MyWidget类中重写鼠标点击事件,如果MyWidget类中的鼠标点击事件发生,那么就是。
//经过验证程序执行了qDebug()<<"+++++++++++++++0";那么就是传递给了 MyWidget,
// 不是给父类(基类)即MyButton类中的事件 qDebug()<<"按钮被按下";
//值得一提的是,ignore()一般不是在这种事件中使用的,而是在closeEvent这种事件中使用的最多。即关闭窗口的时候使用
//可以对MyWidget类中的closeEvent事件进行重写,让其出现提示窗口。
}
else
{
//事件需要继续的往下传递
//这里假设为信号的忽略
//不做处理
QPushButton::mousePressEvent(e);
//事件的忽略,事件继续往下传递
}
}
mywidget.cpp:
#include "mywidget.h"
#include "ui_mywidget.h" #include <QDebug>
#include<QMessageBox>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
connect(ui->pushButton,&MyButton::clicked,[=](){
qDebug()<<"按钮被按下";
});
} MyWidget::~MyWidget()
{
delete ui;
} void MyWidget::mousePressEvent(QMouseEvent *e)
{
qDebug()<<"+++++++++++++++0";
} //MyWidget类中的closeEvent事件进行重写,让其出现是否关闭的提示窗口。
void MyWidget::closeEvent(QCloseEvent *event)
{
int ret = QMessageBox::question(this,"QQQQQ","是否关闭"); if (ret == QMessageBox::Yes)
{
//关闭窗口
//处理关闭窗口事件,接收事件,事件就不会再往下传递
event->accept();
}
else
{
//不关闭窗口
//忽略事件,事件继续给父组件传递
event->ignore();
}
}
Qt+事件的接收和忽略的更多相关文章
- qt事件机制(转)
学习了一段时间的Qt之后,发现Qt的事件机制和其他语言的机制有些不同.Qt除了能够通过信号和槽机制来实现一些Action动作之外,还可以用对象所带的事件,或者用户自定义的事件来实现对象的一些行为处理. ...
- Qt 学习之路 2(19):事件的接受与忽略
Home / Qt 学习之路 2 / Qt 学习之路 2(19):事件的接受与忽略 Qt 学习之路 2(19):事件的接受与忽略 豆子 2012年9月29日 Qt 学习之路 2 140条评论 ...
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...
- QT事件
qtevents多线程工作object存储 Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文 ...
- Qt 事件机制
[1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...
- PyQt学习随笔:Qt事件类QEvent详解
QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...
- Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)
Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...
- qt事件传递过程和处理
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- 【转】QT事件传递与事件过滤器
[概览] 1.重载特定事件函数. 比如: mousePressEvent(),keyPressEvent(), paintEvent() . 2.重新实现QObject::ev ...
随机推荐
- jade安装及基本语法使用
一.cmd安装jade: cnpm install -g jade //cnom install jade -g与上面使用效果一致. 二.jade命令行中使用: 使用cmd: jade index.j ...
- uoj#268. 【清华集训2016】数据交互(动态dp+堆)
传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...
- hyperledger fabric 1.0.5 分布式部署 (五)
梳理fabric e2e_cli 测试程序的具体步骤 作者在 hyperledger fabric 1.0.5 分布式部署 (一)中给读者们介绍了如何从零开始部署一个测试的 demo 环境,如果细心的 ...
- C++中各种简写及全称的库
ATL(Active TEmplate Library)活动模板库 RPC(Remote Procedure Call Protocol)远程过程调用协议 DCE(Distributed Comput ...
- C#连接Sqlite实现单表操作
今天我们来了解下VS使用的众多数据库中比较轻量的数据库SQLITE,好处当然就在于“轻~”!!!.自己理解
- Nacos深入浅出(一)
Nacos代码第一次给我的感觉有点小清新,下面就带大家抽丝剥茧看看源代码,看看阿里大神的东东: 建议大家先把Nacos跑起来,网上有很多教程,最好直接去git里面拉代码,在IDEA里面运行: cons ...
- luoguP3796[模板]AC自动机(加强版)
传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...
- 使用jqzoom插件时
[javascript] view plaincopy /*使用jqzoom*/ $(function() { $(".jqzoom").jqueryzoom({ xzoom: 3 ...
- 使用CSS 实现菱形图片,斜条纹背景
比较简单的菱形图片: 效果如下 代码部分: <div class="d1"> <img src="img/5.jpg"> </di ...
- Codeforces Round #532(Div. 2) B.Build a Contest
链接:https://codeforces.com/contest/1100/problem/B 题意: 给n,m. 给m个数,每个数代表一个等级,没给一个将其添加到题目池中,当题目池中有难度(1-n ...