Qt事件的接收和忽略

Qt的事件是依次分发的,一般由系统自动处理。如果我们需要手动处理事件,需要重写相关的事件函数。在重写函数中,处理完我们所需的操作之后,有两种选择,一种是让事件继续传递,即忽略该事件,另一种是 不让该事件继续传递即接收该事件。下面是简单的示例:

void MyPushButton::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton){//表示接受处理了该事件
        qDebug() << "LeftButton";
    }else{//表示忽略不处理该事件
        QPushButton::mousePressEvent(e);   
    }
}

这样就既不影响别的事件的传递,又可以处理自己需要的事件,看起来很完美。但是有两个函数一直让我疑惑不解,QEvent的accept()和ignore();这两个函数一个是表示接收事件,另一个是忽略事件,但是具体怎么用也不是很懂。最后经过查阅资料才明白。见示例:

void MyPushButton::mousePressEvent(QMouseEvent *e)
{
    qDebug() << e->isAccepted();//true 这个是事件对象默认的即 在Qt中 事件的传递是默认接收的
    if(e->button() == Qt::LeftButton){//表示接受处理了该事件
        qDebug() << "LeftButton";
        //如果在这里调用了ignor函数
        e->ignore();//表示告诉Qt MyPushButton这个对象没有处理该事件,让Qt继续传递给别的对象。
        //但是这里要注意,这个事件继续传递的对象不是基类QPushButton,而是MyPushButton所属的的父组件
    }else{//表示忽略不处理该事件
        QPushButton::mousePressEvent(e);
    }
}

而accept()和ignore()函数的正确用法是用在重写CloseEvent函数中。见示例:

void Widget::closeEvent(QCloseEvent *event)
{
    int ret = QMessageBox::question(this,"关闭窗口","是否要关闭窗口");
    if(ret == QMessageBox::Yes){
        event->accept();
    }else if(ret == QMessageBox::No){
        event->ignore();//继续传递给它的父组件
        QWidget::closeEvent(event);//如果本身就是最顶层的组件 则不需要该语句
    }
}

猜你喜欢

转载自blog.csdn.net/wei375653972/article/details/86617242