Qt 6.5.2 下 QGraphicsView 中使用触控手势的问题
自定义的QGraphicsView 中加入setScene后,其它Gesture能够触发,但 QPanGesture不能在场景中触发。而空白QGraphicsView(QWidget)则可以正常触发PanGesture手势……
源码和文档中都已经说明,gesture是给QGraphicsObject使用的……但我们就是想使用PanGesture手势来操作场景拖动……这可怎么办……
调试源码,发现其qt.widgets.gestures模块的输出没开,找到“C:\Users\用户名\AppData\Local\QtProject”路径,新建qtlogging.ini打开日志输出开关
发现PanGesture被送往了其它QWidget,并未送入QGraphicsView……,当然View的Event、eventFilter也就找不到PanGesture了,而此Widget没有ObjectName、也并非我new出来的,因为怀疑是ViewPort。
对QGraphicsView的viewport()->installFilter(this)
// 注册手势,this为自定义的QGraphicsView this->viewport()->grabGesture(Qt::PanGesture); this->viewport()->grabGesture(Qt::PinchGesture); // 安装事件过滤器 this->viewport()->installEventFilter(this);
事件过滤器如下:
bool StreamControlWidget::eventFilter(QObject* watched, QEvent* event) { // 过滤不必要的鼠标事件。Press Release是为保留点击事件(Qt的单点点击会被转化为鼠标单击事件) if (//event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseMove || //event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::MouseButtonDblClick || event->type() == QEvent::Wheel || //event->type() == QEvent::GraphicsSceneMousePress || event->type() == QEvent::GraphicsSceneMouseMove || //event->type() == QEvent::GraphicsSceneMouseRelease || event->type() == QEvent::GraphicsSceneMouseDoubleClick || event->type() == QEvent::GraphicsSceneWheel) { event->accept(); return true; } if (watched == viewport() && event->type() == QEvent::Gesture) { QGestureEvent* ev = static_cast<QGestureEvent*>(event); if (event->type() == QEvent::Gesture) { return gestureEvent(static_cast<QGestureEvent*>(event)); } return true; } return QWidget::eventFilter(watched, event); }
gestureEvent函数
bool gestureEvent(QGestureEvent* event) { if (QGesture* pch = event->gesture(Qt::PinchGesture)) // 自定义处理 pinchTriggered(static_cast<QPinchGesture*>(pch)); if (QGesture* pan = event->gesture(Qt::PanGesture)) { // 自定义处理 panTriggered(static_cast<QPanGesture*>(pan)); } return true; }
触发正常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通