首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何避免鼠标事件被QGraphicsView吃掉

在使用QGraphicsView时,有时候会遇到鼠标事件被QGraphicsView吃掉的情况。为了避免这种情况发生,可以采取以下几种方法:

  1. 重写QGraphicsView的mousePressEvent、mouseReleaseEvent、mouseMoveEvent等鼠标事件处理函数。在这些函数中,可以通过调用父类的对应函数来保证事件能够正常传递给QGraphicsScene。例如:
代码语言:txt
复制
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
    QGraphicsView::mousePressEvent(event);
    // 处理自己的鼠标按下事件
}
  1. 设置QGraphicsView的属性,使其能够接收鼠标事件。可以通过setInteractive函数将QGraphicsView的Interactive属性设置为true,以确保它能够接收鼠标事件。例如:
代码语言:txt
复制
myGraphicsView->setInteractive(true);
  1. 在QGraphicsView上添加一个透明的QWidget作为overlay,用于处理鼠标事件。可以通过重写overlay的鼠标事件处理函数来处理鼠标事件,并将事件传递给QGraphicsScene。例如:
代码语言:txt
复制
class OverlayWidget : public QWidget
{
protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        // 处理鼠标按下事件
        QGraphicsView *view = qobject_cast<QGraphicsView *>(parent());
        if (view)
        {
            QMouseEvent mappedEvent(event->type(), view->mapFromGlobal(event->globalPos()), event->button(), event->buttons(), event->modifiers());
            QApplication::sendEvent(view->scene(), &mappedEvent);
        }
    }
};

然后将OverlayWidget添加到QGraphicsView上:

代码语言:txt
复制
OverlayWidget *overlay = new OverlayWidget(myGraphicsView);
overlay->setAttribute(Qt::WA_TransparentForMouseEvents);
myGraphicsView->setViewport(overlay);

通过以上方法,可以避免鼠标事件被QGraphicsView吃掉,确保能够正常处理鼠标事件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 取消css事件

    auto 与pointer-events属性未指定时的表现效果相同,对于SVG内容,该值与visiblePainted效果相同 none (一般会用到它,其他属性值很小使用) 元素永远不会成为鼠标事件的target。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向后代元素,在这种情况下,鼠标事件将在捕获或冒泡阶段触发父元素的事件侦听器。 visiblePainted 只适用于SVG。元素只有在以下情况才会成为鼠标事件的目标: visibility属性值为visible,且鼠标指针在元素内部,且fill属性指定了none之外的值 visibility属性值为visible,鼠标指针在元素边界上,且stroke属性指定了none之外的值 visibleFill 只适用于SVG。只有在元素visibility属性值为visible,且鼠标指针在元素内部时,元素才会成为鼠标事件的目标,fill属性的值不影响事件处理。 visibleStroke 只适用于SVG。只有在元素visibility属性值为visible,且鼠标指针在元素边界时,元素才会成为鼠标事件的目标,stroke属性的值不影响事件处理。 visible 只适用于SVG。只有在元素visibility属性值为visible,且鼠标指针在元素内部或边界时,元素才会成为鼠标事件的目标,fill和stroke属性的值不影响事件处理。 painted 只适用于SVG。元素只有在以下情况才会成为鼠标事件的目标: 鼠标指针在元素内部,且fill属性指定了none之外的值 鼠标指针在元素边界上,且stroke属性指定了none之外的值 visibility属性的值不影响事件处理。 fill 只适用于SVG。只有鼠标指针在元素内部时,元素才会成为鼠标事件的目标,fill和visibility属性的值不影响事件处理。 stroke 只适用于SVG。只有鼠标指针在元素边界上时,元素才会成为鼠标事件的目标,stroke和visibility属性的值不影响事件处理。 all 只适用于SVG。只有鼠标指针在元素内部或边界时,元素才会成为鼠标事件的目标,fill、stroke和visibility属性的值不影响事件处理。 示例

    01
    领券