1. 事件传递顺序(测试)
- 继承 QPushButton 自定义个按钮类 XPushButton
- 在父窗口 MainWindow 中添加一个按钮控件 XPushButton * btn;
- 分别在 MainWindow 和 XPushButton 重载 以下两个函数
bool XPushButton::event(QEvent * ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
qDebug()<< "XPushButton event()";
return false;
}
return QPushButton::event(ev);
}
void XPushButton::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
qDebug()<< "XPushButton mousePressEvent()";
}
}
bool MainWindow::event(QEvent *ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
qDebug()<< "MainWindow event()";
return false;
}
return QMainWindow::event(ev);
}
void MainWindow::mousePressEvent(QMouseEvent *ev)
{
qDebug()<< "MainWindow mousePressEvent()";
}
2. 添加事件过滤器
添加以下两个步骤后,子空间的事件首先经由 MainWindow::eventFilter() , 然后再按照 上述流程走一遍。
btn->installEventFilter(父窗口指针);
bool MainWindow::eventFilter(QObject * target, QEvent * ev)
{
if (ev->type() == QEvent::MouseButtonPress)
qDebug()<< "Parent eventFilter: button pressed";
return QWidget::eventFilter(target, ev);
}
3. 特殊事件处理函数的激发方法
setFocusPolicy(Qt::StrongFocus);
void keyPressEvent(QKeyEvent *event) override;