在项目中有需求是实现左右划屏和鼠标点击事件同时能响应,但是按钮组件会将点击事件处理后不下发,所以需要在按钮的上层覆盖一层触摸层,触摸成接收点击事件,处理后继续下发给按钮,实现既能滑动屏幕,又能点击按钮,就像手机一样。
实现这个功能需要重写:mousePressEvent,mouseReleaseEvent,mouseMoveEvent这三个函数
例如:
void sliderArea::mousePressEvent(QMouseEvent *event)
{
m_clickX = event->x();
m_isMove = true;
if (this->parentWidget())//存在父窗口
{
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);//自己不接收点击信号
QPoint point = this->mapTo(this->parentWidget(), event->pos());//获取在父窗口的点击位置
m_curPressBtn = this->parentWidget()->childAt(point);//根据坐标找到穿透后的组件
if (m_curPressBtn)//如果有
{
point = m_curPressBtn->mapFrom(this->parentWidget(), point);
QMouseEvent *mouseEvent = new QMouseEvent(event->type(), point, event->button(), event->buttons(), event->modifiers());
QApplication::postEvent(m_curPressBtn, mouseEvent);//下发鼠标事件
}
this->setAttribute(Qt::WA_TransparentForMouseEvents, false);//自己重新接收点击信号
}
}
QT鼠标点击穿透
于 2022-06-20 15:43:27 首次发布