Qt触屏研究-碰到的一些问题

    最近在搞qt触屏相关的这些由于之前没有经验所以也是碰到了很多问题,有的不一定和触屏相关,这篇主要是总结一下。

首先就是前面说的手势,回去之后自己用一台具有触屏的功能的笔记本测试了一下发现表现出来的效果跟前面一样。按照官方文档QPanGesture是一个手指滑动,QSwipeGesture也是一个手指,也就是两者触点只有一个,但是测试结果并不是这样。

  一个比较简单的测试程序:

bool Widget::event(QEvent *event)
{
    if(event->type() == QEvent::Gesture)
    {
        QGestureEvent *gesevent = static_cast<QGestureEvent*>(event);
        if(QGesture *pinch = gesevent->gesture(Qt::PinchGesture))
        {
           ui->lineEdit->setText("pinch");
        }

        if(QGesture *pan = gesevent->gesture(Qt::PanGesture))
        {
           ui->lineEdit->setText("pan");
        }
        if(QGesture *swipe = gesevent->gesture(Qt::SwipeGesture))
        {
           ui->lineEdit->setText("swipe");
        }
    }
    return QWidget::event(event);
}

下面是测试结果

可以看到一个手指滑动没有任何反应,两指触发pangesture,三指滑动触发swipegesture,而且可以看的这些手势有时会同时触发,网上查阅没有太多关于这个详细的解释,之前的博客也解释过有的人说这是qt的一个坑。

   还有就是之前博客介绍过用QScroller来实现Qt一些控件的触屏滑动效果,结果发现有问题,首先就是自带的滚动条失效了,就像下面这样:

我想通过滚动条来拖动控制结果他触发了触屏的那个滑动效果,后来网上找了很久在一个外国网站上看到一个人提供的思路就是利用事件过滤器,当滚动条EnterEvent的时候接触滑动效果,LeaveEvent的时候再进行绑定。

eventFilter(QObject *watched, QEvent *event) {
    if (watched == this->verticalScrollBar() &&
        event->type() == QEvent::Enter) {
        QScroller::ungrabGesture(this);
    }
    if (watched == this->verticalScrollBar() &&
        event->type() == QEvent::Leave) {
        QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture);
    }
    return QWidget::eventFilter(watched, event);
}

ungrabGesture来解除这个设置,上面代码是因为我重写了那个控件所以参数用的是this,这样以后就解决这个问题了。

关于QListWidget 的重写自然也就避免不了QListWidget 的拖拽功能了,关于这个网上很多例子,这里就不进行额外说明了,然后我在设置了拖拽之后发现也和触屏滑动效果产生了冲突,在我想滑动的时候结果他不仅滑动了也触发了我写的那个拖拽函数,后来也是一个论坛看到了有一种解决方案:

    QScroller::grabGesture(
        this, QScroller::LeftMouseButtonGesture); 
    QScrollerProperties properties =
        QScroller::scroller(this)->scrollerProperties();

    QVariant overshootPolicy =
        QVariant::fromValue<QScrollerProperties::OvershootPolicy>(
            QScrollerProperties::OvershootAlwaysOff);
    properties.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy,
                               overshootPolicy);
    QScroller::scroller(this)->setScrollerProperties(
        properties); //设置触屏滚动属性,防止拖动和滚动相互影响

关于QScrollerProperties的设置可以查看Qt的官方文档,这样设置之后也是好了很多。

   最后还有一个问题,但是这个问题我觉得很奇怪,因为原因我没有找到,网上也没有查到相关资料,就是在QListWidget的拖拽中因为需求原因要设置轨迹图片所以我就当拖拽某一项时利用Qt的控件截图来讲这部分截图,然后设置拖动轨迹。具体就是当QListWidget触发itemPressed信号后执行,获取这个item然后利用QListWidget的visualItemRect来获取这个矩形区域,注意这里的坐标不是真实相对于QlistWidget父组件的而是相对于QListWidget的,所以要进行处理一下获得这一区域的坐标,然后再利用的Qt的区域截图获取这张图片也就是grabWindow函数,然后在拖动函数那里利用QDrag的setPixmap来设置轨迹图片

结果我把整个编译之后发现了一些问题拖动之后有的时候QListWidget的部分鼠标事件有时会失效,鼠标左键的双击和滑动都没有进入相应的事件处理函数,重新启动进行拖动都会这样,查了半天也没有找到哪里有问题,最后一步步测试发现时有两处的代码不能共存,只出现一个是不会有这种问题,第一个地方就是前面说的滑动效果设置:

    QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture);

还有一个就是区域截图

      QPixmap  pix = QPixmap::grabWindow(this->winId(),itemRect);

至于为什么两者共存会这样就不得而知了,网上也没有查到相关说明,有可能时QT的bug,也有可能是这个项目的控件重写部分太多导致的一些问题,总之用grabWidget的截图是不会这样的,这里说明一下,防止有人也遇到了同样的情况,而不知道问题在哪。

 

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值