14事件的接受与忽略
事件的接受与忽略
前面讲过很多事件处理器也有事件。但是有些事件不想处理,或是事件传递的顺序又是如何的。
例子:
在设计器中放入一个按钮,同时定义一个点击事件和信号。那么响应的顺序是怎样的?
//点击事件
void Button::mousePressEvent(QMouseEvent *e)
{
if(e->button()==Qt::LeftButton)
{
qDebug()<<"左键按钮被按下";
}
else
{
Button::mousePressEvent(e);
}
}
//信号
connect(ui->pushButton,&Button::clicked,
[=]()
{
qDebug()<<"按钮被按下";
}
);
结果是只显示:"左键按钮被按下",而"按钮被按下"没有被显示,难道信号没有发出去?
注意:事件被接受后,不会往下传递。
if(e->button()==Qt::LeftButton)
{
qDebug()<<"左键按钮被按下";
}
上句就是处理事件,那么事件不会流向其他控件或是窗口。
改成:
if(e->button()==Qt::LeftButton)
{
qDebug()<<"左键按钮被按下";
e->ignore();
}
e->ignore()表示事件被忽略。
此时发现事件被忽略,输出是:"左键按钮被按下",而"按钮被按下"没有被显示,事件被忽略了,传递给谁了?不是其父类?
在窗口中再定义一个点击事件:
void QWidget::mousePressEvent(QMouseEvent *e)
{
qDebug()<<"-----------";
}
结果显示,只要一点击按钮就显示:
左键按钮被按下-----------左键按钮被按下-----------左键按钮被按下-----------
点击按钮以外,则显示:-----------;
结论:事件传递了父组件,不是给父类(基类)
{
ui->setupUi(this);
// 继承自定义的Button类
connect(ui->pushButton,&Button::clicked,
[=]()
{
qDebug()<<"按钮被按下";
}
);
}
void QWidget::mousePressEvent(QMouseEvent *e)
{
qDebug()<<"-----------";
}
事件的接受和忽略可以应用的消息框。
void Widget::closeEvent(QCloseEvent *e)
{
int nRet=QMessageBox::question(this,"窗口","是否要关闭");
switch (nRet) {
case QMessageBox::Yes:
e->accept();
break;
case QMessageBox::No:
e->ignore();
break;
}
}
当点击“确认”时,就接受事件进行处理,否则直接忽略。