c++ QGraphicsitem场景事件处理程序

igetnqfo  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(254)

我试图实现的是以下内容:
我有一个QGraphicsitem,我可以使用鼠标或手指按下并拖动它,所以它的颜色会随着拖动而逐渐变化。
此外,我想使用触摸事件调整大小。
我已经做了所有鼠标相关的事件处理程序,如mousePressEvent,mouseMoveEvent和mouseReleaseEvent。而且似乎触摸事件在Windows下默认转换为鼠标事件。
现在我添加以下代码来重新实现graphicItem的sceneEvent函数:

bool MapGraphicItem::sceneEvent(QEvent * event)
    {
        switch (event->type()) {
        case QEvent::TouchBegin:
        case QEvent::TouchUpdate:
        case QEvent::TouchEnd:
            QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
            QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
            if (touchPoints.count() == 2) {
                //do the zoom
                }
            return true;
        }

        return QGraphicsItem::sceneEvent(event);
    }

缩放也工作,问题是在捏缩放,鼠标事件也被触发,所以颜色改变,我不想。
对此该如何应对?

shstlldc

shstlldc1#

qt确实会自动生成"合成"鼠标事件,以允许仅为鼠标设计的应用程序在触摸屏上工作。
要区分来自物理鼠标和合成鼠标的事件,可以执行以下操作:
1.将图形项目的所有事件处理代码从mousePressEvent、mouseMoveEvent和mouseReleaseEvent移动到sceneEvent方法。您应该在case QEvent::GraphicsSceneMousePress、QEvent::GraphicsSceneMouseMove和QEvent::GraphicsSceneMouseRelease的switch语句中添加case。
1.在上述sceneEvent情况下,检查您接收的事件是否来自物理鼠标,而不是合成的。通过将事件指针转换为QGraphicsSceneMouseEvent * 并仅处理source()方法返回Qt::MouseEventNotSynthesized的事件来执行此操作
示例:

bool MapGraphicItem::sceneEvent(QEvent * event)
{
    switch (event->type()) {
    case QEvent::GraphicsSceneMousePress:
        if (event && ((QGraphicsSceneMouseEvent*)event)->source() == Qt::MouseEventNotSynthesized)
            handleMousePress();
        return true;
    case QEvent::GraphicsSceneMouseMove:
        if (event && ((QGraphicsSceneMouseEvent*)event)->source() == Qt::MouseEventNotSynthesized)
            handleMouseMove();
        return true;
    case QEvent::GraphicsSceneMouseRelease:
        if (event && ((QGraphicsSceneMouseEvent*)event)->source() == Qt::MouseEventNotSynthesized)
            handleMouseRelease();
        return true;
    // i left the rest of your while block unchanged
    case QEvent::TouchBegin:
    case QEvent::TouchUpdate:
    case QEvent::TouchEnd:
        QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
        QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();
        if (touchPoints.count() == 2) {
            //do the zoom
            }
        return true;
    }

    return QGraphicsItem::sceneEvent(event);
}

相关问题