将viewportEvent中的Qt鼠标消息重定向到其他窗口不起作用
我想实现一个扩展的“QScrollArea”小部件,它支持通过将鼠标拖动到小部件中的某个位置来使用鼠标滚动滚动滚动条(内容)。为此,我想忽略任何子窗口小部件,这样焦点就不会意外地转移到一些子窗口小部件上 我的解决方案(不起作用)是设置内容小部件属性将viewportEvent中的Qt鼠标消息重定向到其他窗口不起作用,qt,redirect,filter,message,qwidget,Qt,Redirect,Filter,Message,Qwidget,我想实现一个扩展的“QScrollArea”小部件,它支持通过将鼠标拖动到小部件中的某个位置来使用鼠标滚动滚动滚动条(内容)。为此,我想忽略任何子窗口小部件,这样焦点就不会意外地转移到一些子窗口小部件上 我的解决方案(不起作用)是设置内容小部件属性WA_TransparentForMouseEvents,以便所有鼠标事件都转到我的QScrollAreaEx中的viewportEvent()方法。这里我想处理鼠标消息。例如,我可以确定其意图是拖动滚动条位置还是与一些子窗口小部件(激活、选择、移动插
WA_TransparentForMouseEvents
,以便所有鼠标事件都转到我的QScrollAreaEx
中的viewportEvent()方法。这里我想处理鼠标消息。例如,我可以确定其意图是拖动滚动条位置还是与一些子窗口小部件(激活、选择、移动插入符号等)交互
我的第一次尝试是将消息MouseButtonPress和MouseButtonRelease仅重定向到下面的子小部件(widget()->childAt(e->pos()),如果未设置WA_TransparentForMouseEvents
,则该小部件已被聚焦。然而这并没有起作用,没有一个widgetd得到关注。但是为什么呢
bool viewportEvent(QEvent* e) {
bool IsMouseEvent = e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove;
QMouseEvent* me = (QMouseEvent*) e;
bool IsHandled = false;
if (IsMouseEvent) {
if (e->type() == QEvent::MouseButtonPress) {
_PressEvent = *me;
IsHandled = true; // Eating press event
} else if (e->type() == QEvent::MouseButtonRelease) {
QPoint PressPoint = _PressEvent.pos();
widget()->setAttribute(Qt::WA_TransparentForMouseEvents, false);
QWidget* w = widget()->childAt(PressPoint);
if (w) {
QPoint p1 = w->mapFrom(widget(), _PressEvent.pos());
QPoint p2 = w->mapFrom(widget(), me->pos());
QMouseEvent* e1 = new QMouseEvent(QEvent::MouseButtonPress, p1, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QMouseEvent* e2 = new QMouseEvent(QEvent::MouseButtonRelease, p2, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCoreApplication::postEvent(w, e1);
QCoreApplication::postEvent(w, e2);
}
widget()->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}
}
if (IsHandled) return true;
return QScrollArea::viewportEvent(e);
}
第二项测试是:
bool viewportEvent(QEvent* e) {
bool IsMouseEvent = e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove;
QMouseEvent* me = (QMouseEvent*) e;
bool IsHandled = false;
if (IsMouseEvent) {
if (e->type() == QEvent::MouseButtonPress) {
_PressEvent = *me;
IsHandled = true; // Eating press event
} else if (e->type() == QEvent::MouseButtonRelease) {
QPoint PressPoint = _PressEvent.pos();
widget()->setAttribute(Qt::WA_TransparentForMouseEvents, false);
QWidget* w = widget()->childAt(PressPoint);
if (w && w != widget()) {
QCoreApplication::sendEvent(widget(), &_PressEvent);
QCoreApplication::sendEvent(widget(), e);
}
widget()->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}
}
if (IsHandled) return true;
return QScrollArea::viewportEvent(e);
}
他们没有一个人在工作。为什么重定向不起作用。有更好的解决方案吗?widget()->setAttribute(Qt::WA_TransparentForMouseEvents,true)是我想要的