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);//如果本身就是最顶层的组件 则不需要该语句
}
}