我试图实现的是以下内容:
我有一个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);
}
缩放也工作,问题是在捏缩放,鼠标事件也被触发,所以颜色改变,我不想。
对此该如何应对?
1条答案
按热度按时间shstlldc1#
qt确实会自动生成"合成"鼠标事件,以允许仅为鼠标设计的应用程序在触摸屏上工作。
要区分来自物理鼠标和合成鼠标的事件,可以执行以下操作:
1.将图形项目的所有事件处理代码从mousePressEvent、mouseMoveEvent和mouseReleaseEvent移动到sceneEvent方法。您应该在case QEvent::GraphicsSceneMousePress、QEvent::GraphicsSceneMouseMove和QEvent::GraphicsSceneMouseRelease的switch语句中添加case。
1.在上述sceneEvent情况下,检查您接收的事件是否来自物理鼠标,而不是合成的。通过将事件指针转换为QGraphicsSceneMouseEvent * 并仅处理source()方法返回Qt::MouseEventNotSynthesized的事件来执行此操作
示例: