Qt 框架会经历一系列的步骤来处理这个事件。以下是完整的处理流程
Qt 框架会经历一系列的步骤来处理这个事件。以下是完整的处理流程
-
用户操作
用户用鼠标点击 QPushButton。 -
事件生成
Qt 创建一个 QMouseEvent 事件对象,表示鼠标按下的动作。该事件包含有关鼠标位置、按下的按钮等信息。 -
事件排队
该事件被添加到事件队列中,等待处理。 -
进入事件循环
应用程序的事件循环(QApplication::exec())开始运行,不断检查事件队列中的事件。 -
事件过滤器(如果有)
在事件到达目标对象之前,Qt 会检查是否有安装的事件过滤器。事件过滤器可以对事件进行处理或修改。
bool MyWidget::eventFilter(QObject *obj, QEvent *event) {if (event->type() == QEvent::MouseButtonPress) {// 可以在这里处理或拦截事件return true; // 返回 true 表示事件已处理,不再传递}return QWidget::eventFilter(obj, event); // 继续传递
}
-
事件分发
事件过滤器处理完成后,事件被传递给目标对象(即 QPushButton)。Qt 根据事件类型查找相应的事件处理函数。 -
调用 mousePressEvent
对于鼠标按下事件,Qt 会调用 QPushButton::mousePressEvent(QMouseEvent *e)。
void QPushButton::mousePressEvent(QMouseEvent *e) {if (e->button() == Qt::LeftButton) { // 检查是否是左键setDown(true); // 设置按钮为按下状态repaint(); // 重新绘制按钮emit pressed(); // 发出 pressed 信号e->accept(); // 表示事件已被处理} else {e->ignore(); // 其他按钮忽略}
}
- 调用 mouseReleaseEvent
当用户释放鼠标按钮时,Qt 会调用 QPushButton::mouseReleaseEvent(QMouseEvent *e)。
void QPushButton::mouseReleaseEvent(QMouseEvent *e) {if (e->button() == Qt::LeftButton) {setDown(false); // 设置按钮为非按下状态emit clicked(); // 发出 clicked 信号e->accept(); // 表示事件已被处理} else {e->ignore(); // 其他按钮忽略}
}
-
发出信号
在 mouseReleaseEvent 中,按钮发出 clicked() 信号。这个信号可以连接到其他对象的槽函数,以响应按钮的点击事件。 -
连接的槽函数执行
如果有任何槽函数连接到 clicked() 信号,它们会被调用。
connect(myButton, &QPushButton::clicked, this, &MyClass::handleButtonClick);
- 事件处理完成
事件处理流程完成。应用程序返回到事件循环,准备处理下一个事件。