Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将viewportEvent中的Qt鼠标消息重定向到其他窗口不起作用_Qt_Redirect_Filter_Message_Qwidget - Fatal编程技术网

将viewportEvent中的Qt鼠标消息重定向到其他窗口不起作用

将viewportEvent中的Qt鼠标消息重定向到其他窗口不起作用,qt,redirect,filter,message,qwidget,Qt,Redirect,Filter,Message,Qwidget,我想实现一个扩展的“QScrollArea”小部件,它支持通过将鼠标拖动到小部件中的某个位置来使用鼠标滚动滚动滚动条(内容)。为此,我想忽略任何子窗口小部件,这样焦点就不会意外地转移到一些子窗口小部件上 我的解决方案(不起作用)是设置内容小部件属性WA_TransparentForMouseEvents,以便所有鼠标事件都转到我的QScrollAreaEx中的viewportEvent()方法。这里我想处理鼠标消息。例如,我可以确定其意图是拖动滚动条位置还是与一些子窗口小部件(激活、选择、移动插

我想实现一个扩展的“QScrollArea”小部件,它支持通过将鼠标拖动到小部件中的某个位置来使用鼠标滚动滚动滚动条(内容)。为此,我想忽略任何子窗口小部件,这样焦点就不会意外地转移到一些子窗口小部件上

我的解决方案(不起作用)是设置内容小部件属性
WA_TransparentForMouseEvents
,以便所有鼠标事件都转到我的
QScrollAreaEx
中的viewportEvent()方法。这里我想处理鼠标消息。例如,我可以确定其意图是拖动滚动条位置还是与一些子窗口小部件(激活、选择、移动插入符号等)交互

我的第一次尝试是将消息MouseButtonPressMouseButtonRelease仅重定向到下面的子小部件(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)是我想要的