【QT】39.QT事件处理(下)

QEvent是所有事件类的父类

 

标记当前事件是否被处理。

有些情况调用accept() 函数 父组件有可能还会处理一下。

class Widget : public QWidget
{
    Q_OBJECT
    MylineEdit m_lineEdit;
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent *);        // 重写事件处理函数
    ~Widget();
};
class MylineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MylineEdit(QWidget *parent = 0);
    // 重写事件处理函数
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
       
};
bool MylineEdit::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress)
    {
        qDebug() << "MylineEdit::event";
    }
    return QLineEdit::event(e);
}
void MylineEdit::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "MylineEdit::keyPressEvent";
    QLineEdit::keyPressEvent(e);
    e->ignore();   // 这里忽略当前事件,传给了父组件QWiget
}

 

 

 

 

 

//事件过滤器典型实现
/********
返回 true : 表示事件已经处理,无需传递给 obj
返回 false: 正常传递到 obj
*********/
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
    if( /* 根据 obj 判断 对象*/)
    {
        if( /* 根据 e->type() 判断事件)
        {
            // 事件处理逻辑
        }
    }
    // 调用父类中的同名函数
    return QWidget::eventFilter(obj, e);
}
class Widget : public QWidget
{
    Q_OBJECT
    MylineEdit m_lineEdit;
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent *);
    
    // 可以重写 是因为任意QObject 可以作为事件过滤器使用
    bool eventFilter(QObject * obj, QEvent * e);   
    ~Widget();
};
Widget::Widget(QWidget *parent)
    : QWidget(parent), m_lineEdit(this)
{
    m_lineEdit.installEventFilter(this);
    // 对自己感兴趣的组件进行安装
}


bool Widget::eventFilter(QObject * obj, QEvent * e)
{
    bool ret = true;
    if( (obj == &m_lineEdit) && (e->type() == QEvent::KeyPress))
    {
        QKeyEvent* evt = dynamic_cast<QKeyEvent*>(e);
        switch(evt->key())
        {
           case Qt::Key_0:
          case Qt::Key_1:
            ret = false;
          default:
             break;
        }
    }
    else
    {
        return QWidget::eventFilter(obj, e);
    }
    return ret;
}

事件过滤器在实际工程中有很多用处,需要安装到感兴趣的对象上

截获消息,过滤不要的消息,处理自己想要的消息

 

注:本笔记根据狄泰软件学院课程做的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值