QT 窗口A覆盖窗口B时,窗口B接受不到鼠标事件
一、问题
在项目的需求中,地图A上面需要叠放一个任务窗口B,B覆盖了A,导致A接受不到鼠标及滚轮事件。
二、解决方案
1、Qt::WA_TransparentForMouseEvents 是 Qt 框架中的一个属性,用于使指定的控件及其子控件不响应鼠标事件。当启用此属性时,鼠标事件将传递给其他控件,就像这些控件及其子控件不存在于控件层次结构中一样
2、利用postEvent给指定控件发送事件。 重载上面widget的事件处理函数,利用postEvent发送事件,让事件分发给下面的窗口
三、案例
//上层窗口
void Widget::mousePressEvent(QMouseEvent *event)
{
QWidget::mousePressEvent(event);
postMouseEventToSlibings(event);
qDebug() << "widget mousePressEvent";
}
void Widget::postMouseEventToSlibings(QMouseEvent *event)
{
if (this->parentWidget())
{
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
auto point = this->mapTo(parentWidget(), event->pos());
auto widget = parentWidget()->childAt(point);
if (widget)
{
point = widget->mapFrom(parentWidget(), point);
auto e = new QMouseEvent(event->type(), point, event->button(),
event->buttons(), event->modifiers());
QApplication::postEvent(widget, e);
}
}
setAttribute(Qt::WA_TransparentForMouseEvents, false);
}