pb、pbex、Widget、MainWindow 都override了 mousePressEvent
//PushButton(继承QPushButton)
void PushButton::mousePressEvent(QMouseEvent *e)
{
e->ignore();// 这里设置e->accept 或者不写,就只会打印PushButton::mousePressEvent、PushButtonEx::mousePressEvent这两行,
// 如果是e->ignore 那么接着往上传,也就是Widget会接收到,Widget 也会处理
qDebug()<< endl <<"PushButton::mousePressEvent"<< endl;
}
//PushButtonEx(继承PushButton)
void PushButtonEx::mousePressEvent(QMouseEvent *e)
{
// e->ignore();
PushButton::mousePressEvent(e);
qDebug()<< endl <<"PushButtonEx::mousePressEvent"<< endl;
}
//Widget(继承QWidget)
void Widget::mousePressEvent(QMouseEvent *e)
{
qDebug()<< endl <<"Widget::mousePressEvent"<< endl;
}
// MainWindow(继承自QMianWindow)
void MainWindow::mousePressEvent(QMouseEvent *event)
{
qDebug()<< endl <<"MianWindow::mousePressEvent" << endl;
}
// 测试步骤:
// 步骤一:所有的控件上什么都不添加,
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButtonEx::mousePressEvent
// 步骤二:仅在PushButtonEx上添加 e->ignore
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButtonEx::mousePressEvent Widget::mousePressEvent
// 步骤三:仅在PushButtonEx上添加 PushButton::mousePressEvent(e),
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButton::mousePressEvent PushButtonEx::mousePressEvent // 注意与上面比较,层次上面的比较与打印顺序的比较
// 步骤四:仅在PushButtonEx上添加 QPushButton::mousePressEvent(e)
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButtonEx::mousePressEvent
// 步骤五:仅在PushButtonEx上添加 QWidget::mousePressEvent(e)
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButtonEx::mousePressEvent Widget::mousePressEvent
// 步骤六:仅在PushButton上添加 e->ignore
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent Widget::mousePressEvent
//PushButtonEx::mousePressEvent
// 步骤七:仅在PushButton上添加 QPushButton::mousePressEvent(e)
// 先后点击pb、pbex:结果显示:PushButton::mousePressEvent
//PushButtonEx::mousePressEvent
// 步骤八:仅在Widget上添加 e->ignore
// 先后点击widget界面(也就是空白区域):结果显示:Widget::mousePressEvent、MainWindow::mousePressEvent
// 步骤九:仅在Widget上添加 QWidget::mousePressEvent(e)
// 先后点击widget界面(也就是空白区域):结果显示:Widget::mousePressEvent、MainWindow::mousePressEvent
结论:
1、如果override 了事件处理器,并且ignore了,那么会往父窗口传递事件(注意!注意!注意!不是父类,是父窗口)。
2、在步骤六七和八九中可以看出,事件在QWidget 上默认是ignore,而其他的窗口上是accept 的。