Qt--事件系统理解

Qt事件系统

   简单理解:
        qt整个事件系统是基于事件循环的,Qt主界面就是一个事件循环exec(),
        通过exit()退出事件循环,事件会放在事件队列里,如果有事件就会不停的
        触发去处理,如果没有事件就会阻塞,和socket的异步模型有些类似;

1.Qt中的事件与信号的区别

  1. 返回值:事件处理函数如果返回true,则这个事件处理完成,QApplication会继续处理下一个事件,如果返回false,那么事件会继续向上寻找下一个可以处理该事件的的注册方法;而信号的返回值是没有用的;
  2. 优先级:事件因为都是与窗口相关的,所有事件回调都是从当前窗口开始,一级一级向上派发,知道有一个窗口返回true;而信号的处理顺序与信号槽关联的顺序有关(QT5);
  3. 处理方式:事件使用了一个事件队列来维护,有新的事件就添加到队尾,处理完队列,就重新从列头继续处理;而信号处理是立刻回调的;

2.事件的接收和处理方法
// 按照顺序从上到下逐级下发

    bool QCoreAppliction::sendEvent(QObject *receiver,QEvent *event); //同步
    void QCoreAppliction::postEvent(QObject* receiver,QEvent *event);   //插入事件队列 异步
    bool QCoreApplication::notify(QObject *receiver,QEvent *event);
    bool QObject::eventFilter(QObject *watched,QEvent *event);
    bool QObject::event(QEvent *event);
    void QWidget::keyPressEvent(QKeyEvent *event);
事件处理的五种方式:
---
    // 345 比较常用
    1.重写notify() 
    2.给QCoreAppliction installEventFilter(); 
    3.给具体的控件installEventFilter();
    4.重写QEvent();
    5.重写具体的事件keyPressEvent();
---
##重写具体的事件:
---
 #include <QKeyEvent>
 // 键盘按下 0-9 数字键 lab会更改显示内容
  void keyPressEvent(QKeyEvent *event){
       if(0x30 <= event->key() && 0x39 >=event->key()){
           m_pLab->setStyleSheet("color:red");
           m_pLab->setText(QString("key is %1").arg(event->key()-48));
       }else{
           m_pLab->setText("Please enter from 0 to 9");
       }
   }
   // 释放的时候 lab的内容会设置样式表
   void keyReleaseEvent(QKeyEvent *event){
       if(event->key()){
           m_pLab->setStyleSheet("color:red;font:20px");
       }
   }
##重写QEvent()
// 鼠标按下动态显示 鼠标的位置
   #include <QEvent>
    #include <QMouseEvent>
    bool widget::event(QEvent *event)
    {
        if(event->type() == QEvent::MouseMove){
            QMouseEvent *e = static_cast<QMouseEvent *>(event);
            m_pBtnTxt->setText(QString("QkeyPress:%1,%2").arg(e->x()).arg(e->y()));
            return true;
        }
        return QWidget::event(event);
    }
##安装事件过滤器 eventfilter()
 	m_pLE->installEventFilter(this);    
    bool widget::eventFilter(QObject *watched, QEvent *event)
    {
        if(watched == this->m_pLE){
            QMouseEvent *e = static_cast<QMouseEvent *>(event);
            if(e->type() == QEvent::MouseButtonDblClick)
            {
                QString temp = m_pLE->text();
                temp+="Enter";
                m_pLE->setText(temp);
                return true;
            }
        }
        return QWidget::eventFilter(watched,event);
    }
百度网盘链接代码:https://pan.baidu.com/s/1EDyujTeSXgRjtP7YkHcLxQ
分享码:1234
编译器 mingw 32bit
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值