Qt override 事件处理程序与 accept 和 ignore的使用详例

时间:2024-04-06 10:28:43

Qt override 事件处理程序与 accept 和 ignore的使用详例

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 的。