首页 > 其他分享 >Qt 6.5.2 下 QGraphicsView 中使用触控手势的问题

Qt 6.5.2 下 QGraphicsView 中使用触控手势的问题

时间:2023-11-03 15:22:06浏览次数:27  
标签:QGraphicsView Qt event 6.5 PanGesture type QEvent

自定义的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;
}

触发正常

标签:QGraphicsView,Qt,event,6.5,PanGesture,type,QEvent
From: https://www.cnblogs.com/Paoyao/p/17807601.html

相关文章

  • QT使用QML实现地图绘制虚线
    QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图:鼠标在地图上点击后,在点击位置添加图标,当有多个图标被添加到地图上后,计算各个图标间的距离,并创建一个新的虚线线段组件,连接两个图标点,显示距离数值。如果对自定义图标......
  • Qt开发实现字幕滚动效果
    1、效果展示我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。2、实现思路实现一个窗口部件,这个窗口部件显示了一串文本标语,它会每t毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。3、滚动窗口部件创建一个滚......
  • Qt3D改变观察视角例程(二)
    本例依旧是改变3D视角。不同的是这个是视野位置不变而只改变观察方向。相当于一个人站在原地不动,旋转脑袋看周围的东西。测试的条件是VS2017和Qt5.9。主要的知识点就是欧拉角的计算。下面是效果图:头文件:classQOpenGLTexture;classQOpenGLBuffer;classMvOpenGLWidget:p......
  • PyQt5-如何设置主窗口居中?退出应用程序如何操作?
    (15如何设置主窗口居中?退出应用程序如何操作?)1如何实现主窗口居中显示?让主窗口居中,其实就是让窗口的左右边缘到左右屏幕距离相等,让窗口的上下边缘到上下屏幕的距离相等;主要是需要进行计算和移动工作;可以使用QDesktopWidget类来获取屏幕的大小和位置信息,然后根据这些信息计......
  • Qt - 获得当前窗口所在屏幕的大小
    qt获得当前窗口所在屏幕的大小 假如这个窗口的指针为this,记得要加头文件哦#include<QDesktopWidget>#include<QApplication>//获得当前屏幕是第几屏幕intnumber=QApplication::desktop()->screenNumber(this);//如果number是-1会出现崩溃,就是用默认0if(number<0)......
  • qt按键图标大小和设置大小不符的问题记录
    问题描述:在导航栏中有几个toolbuttoon,ui文件设置的控件大小相同但图标大小不同问题解决:经过排查,图片和ui文件没有问题,最后发现qss样式中border-image,background-image和image对于相同图标会显示出不同大小。#background-image只根据图片资源的大小,不按照控件的大小,相对于控......
  • Qt 中的正则表达式
    Qt中的正则表达式常用QRegExp类一、正则表达式的常用匹配符^test:匹配字符的开始[^test]:表示除t,e,s,t以外的字符$:表示匹配字符串的结束[0-9]:表示0到9之间的数字*:表示匹配前面的字符0次或多次,如a*表示匹配0次或多次a字符,[0-9]*表示匹配数字0次或多次+:匹配前面的......
  • Qt获取电脑有几个网卡,并获取对应的IPV4
    标题:Qt获取电脑网卡对应的ip|Qt计算电脑有几个网卡|Qt获取网卡ip信息|Qt判断获取到的ip是否是IPV4 demo流程:1.点击搜索网卡按钮,搜索电脑所有的网卡,将网卡名称添加到QComBoBox下拉框中2.切换下拉框,点击获取IP按钮,查询出选择的网卡的对应ip(IPV4)  //x.h#include......
  • Qt通过UDP发送广播
      //x.hQUdpSocket*udp=nullptr;//UDP对象voidcreateUdpAndSendData();//创建UDP对象和发送广播数据voiddropUdp();//释放UDP对象voidreadData();//用来接收其他设备发送的数据voidcreateUdpAndSendData(){......
  • VS Qt扩展插件下载地址
      使用vs开发qt项目,需要安装qt插件QT插件下载地址:https://mirrors.ustc.edu.cn/qtproject/official_releases/vsaddin/ ......