1.常见事件

【1】鼠标事件

(1)坐标

x(),y(),

相对windows globalX() globalY()

(2)获得点击

button()

【2】键盘事件

【3】定时器事件

timerID1 = startTimer(time)
timerID2 = startTimer(time)
killTimer(timerID1)
timeEvent()

{

  if (e->timerId() == timerID1) {

  }

}

2. 事件的接受和忽略

示例:

  同时设置 mousePressEvent() 和 connect(,clicked,)

  当事件发生后,

  mousePressEvent() 执行,而 connect 没触发

  原因:

  事件触发后传递给 mousePressEvent, mousePressEvent接受了事件,所以事件没有继续向下传,就没有发出 clicked 信号。

  如果希望触发 connect,需要在 mousePressEvent中调用父类的mousePressEvent。

结论:

      信号和事件的关系

  信号有两种来源:事件生成信号、手动生成信号(emit signal())

  如果自定义控件后,重写事件虚函数,那么会导致信号无法生成,需要再调用基类事件函数以生成信号。

      事件的接受和忽略

  accept() ignore()

  谁的事件产生,谁先得到事件,传递方向是向父控件(不是基类)

  事件选择 accpet() ,事件不会传向父控件

  事件选择 ignore() , 事件会传递给父控件

  默认情况:

      实验:

        myFrame -> QFrame

        mousePressEvent

        子控件 myFrame 父控件继承于 QWidget

        结果:

            默认情况,没有传递

            accept, 没有传递

            ignore 传递给父控件

     再次总结事件和信号

   事件由 exec() 监听,谁的事件触发,执行谁的事件处理函数

   信号由 emit 以广播形式发出, connect 会监听信号

   借助事件处理函数执行 emit signal, 实现事件触发信号

3. 事件的过滤

 (1)事件的处理流程

    不考虑事件过滤器:QApplication::exec()循环监听事件,当事件触发,Qt构造事件对象(所有事件对象都继承与 QEvent),事件对象传递给触发事件的 QObject::event() 函数, event() 不直接处理事件,而是进行事件的转发,事件将由对应的 event handler 处理。

  event()

  bool QObject::event(QEvent *e);

  返回值:

    true 表示,Qt会认为事件已经被正确处理,不会再将事件传递给父控件对象,而是处理事件队列中的其他事件。

    false,事件未被处理,将传递给其他对象。

    event()中使用 accpet() 和 ignore 是没有的。

  event()是 protect ,意味可以重写该虚函数,实现事件的过滤,

 如下,就只关注键入 tab 的事件

bool CustomTextEdit::event(QEvent *e)
{
   if (e->type() == QEvent::KeyPress)
{
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
       if (keyEvent->key() == Qt::Key_Tab)
{
            qDebug() << "You press tab.";
            return true;
       }
    }
    return false;
}

  event的其他用处

  如下为 Qt5 的 event() 源码, 可以看出,可以只重写 event() ,就可以完成所有 event handler 的处理。

//!!! Qt5
bool QObject::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::Timer:
        timerEvent((QTimerEvent*)e);
        break;

    case QEvent::ChildAdded:
    case QEvent::ChildPolished:
    case QEvent::ChildRemoved:
        childEvent((QChildEvent*)e);
        break;
    // ...
    default:
        if (e->type() >= QEvent::User) {
            customEvent(e);
            break;
        }
        return false;
    }
    return true;
}

  总结:

    event() :

      作用:事件的分发

      返回值:true ,事件成功分发,不会再传递,false,事件会被传递; accept ignore 无用

      用法:

        事件过滤,只向下分发需要的事件,其他的则传递给别的对象(即返回 false)

        event handler的集中处理。

  事件过滤器

    安装过滤器后,事件的处理流程:

      exec()监听事件,事件触发,Qt构造事件对象,经过事件过滤器,通过过滤再到 event(),event()分发给event handler。

    事件过滤器的好处,可以集中处理控件的事件过滤,避免写多个 event()

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

    返回值: true 事件被过滤,事件不会传递给目标对象(watched),false事件会传递给目标对象(watched)

    调用时机:事件传递给目标对象前

    使用方法:

      设置一个(生命周期)全局的事件过滤器,一般用 主控件,重写 eventFileter。

      需要过滤的对象安装 过滤器

    过滤器安装:

    

void QObject::installEventFilter ( QObject * filterObj )

   过滤器移除

QObject::removeEventFilter()

  过滤器的执行顺序:如果一个对象安装了多个过滤器,那么后安装先执行。

  其他:

    过滤器和被过滤对象必须同个线程,否则无用。

    过滤器会降低执行速度,慎用

class MainWindow : public QMainWindow
 {
 public:
     MainWindow();
 protected:
     bool eventFilter(QObject *obj, QEvent *event);
 private:
     QTextEdit *textEdit;
 };

 MainWindow::MainWindow()
 {
     textEdit = new QTextEdit;
     setCentralWidget(textEdit);

     textEdit->installEventFilter(this);
 }

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
     if (obj == textEdit) {
         if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             return true;
         } else {
             return false;
         }
     } else {
         // pass the event on to the parent class
         return QMainWindow::eventFilter(obj, event);
     }
 }

Qt——事件的更多相关文章

  1. QT事件

    qtevents多线程工作object存储 Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文 ...

  2. Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)

    Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...

  3. qt事件传递过程和处理

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  4. Qt 事件机制

    [1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...

  5. 【转】QT事件传递与事件过滤器

        [概览] 1.重载特定事件函数.    比如: mousePressEvent(),keyPressEvent(),  paintEvent() .     2.重新实现QObject::ev ...

  6. 详解 QT 源码之 Qt 事件机制原理

    QT 源码之 Qt 事件机制原理是本文要介绍的内容,在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使 Qt 程序进入消息循环.下面我们就到ex ...

  7. Qt事件机制---信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。

    转:http://www.cnblogs.com/findumars/p/8001484.html Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和.先处理自己队列中的消息,然后再处 ...

  8. Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

    Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...

  9. [GUI] QT事件与X11的关系

    做了一段时间linux下与QT事件相关的工作,经常会遇到X11,总是苦于无法完全理解其与linux以及QT事件之间的关系,所以用两篇文章来简单总结下linux中的图形管理和QT事件与X11的关系. & ...

  10. qt事件机制(转)

    学习了一段时间的Qt之后,发现Qt的事件机制和其他语言的机制有些不同.Qt除了能够通过信号和槽机制来实现一些Action动作之外,还可以用对象所带的事件,或者用户自定义的事件来实现对象的一些行为处理. ...

随机推荐

  1. 【源码分析】cocos2dx的Action

    第一次去学习Action,总会找到一篇入门的帖子(官网:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos- ...

  2. lua学习笔记之userdata

    这一段时间看了<programming in lua>中的第28章,看一遍并不是很难,但是只是朦胧的感觉,雾里看花,水中望月.最终还是决定敲出来自己看看,练练手,结果受益不少,也遇到了一些 ...

  3. php解决高并发设想

    1.我突然想到一个解决系统并发的一个方法, 当然不算太友好, 就是并发时候,首先加载系统负载量文件, 如果到达一个值,比如60%,就跳到404页面,或者输出稍后之类的这样 2.静态文件和图片存到cdn ...

  4. iframe加载顺序导致数据访问出现问题

    背景: 一个页面A内有一个iframe,src指向了B页面. 问题: 页面A通过Ajax获取服务器数据,并赋值给了页面A的全局变量gData,页面B要用到页面A的数据gData.那么问题来了当B访问g ...

  5. photoshopcs6破解补丁用来干嘛的

    photoshopcs6破解补丁为 Adobe CS6 系列软件通用破解补丁,亲测可用,终于能用了不再出现那个烦人的购买页面了,cs6破解补丁解压后得到32和64两个文件夹,根据自己的系统类型选择,6 ...

  6. Linux内核收包过程

    net/core/dev.c int __init net_dev_init(void) { queue->backlog.poll = process_backlog; open_softir ...

  7. 简单的python爬虫--爬取Taobao淘女郎信息

    最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好! 爬虫的入口:https://mm.taobao.com/json/r ...

  8. GO语言(六)接口使用

    <music> |------<src> |-------<library> |-------manager.go |-------manager_test.go ...

  9. navicat远程连接mysql,2003 can't connect to mysql server on 10038

    转载地址:https://blog.csdn.net/f12105212/article/details/70768516 1:我们连接远程服务器的mysql,如果出现问题,很大问题会出在服务器的端口 ...

  10. React Router V4.0学习笔记

    最近在学习React Router,但是网站的教程多半还是3.X版本之前的,所以我只能在GitHub上找到React Router的官方文档在读.后来总结了一下,包括学习经验以及V3.X与V4.X的差 ...