改进FlickCharm

不知道FC是什么,就看关于StackedWidget的文章,然后就知道他有啥问题了。如果你对FC代码没有进行过推敲,那你就不知道我在说什么,我不是在告诉你flickcharm是做什么的,我在说如果改进它,适应触摸环境。

 

现在我就想在scrollarea里面放一些会接收mouse事件的widget,首当其冲的就是buttons。直接试,结果是也能滚动,但是如果你按下了,滚动了,松手时鼠标或者手指仍然在button上,你会发现,shit!button的click被触发了……

 

这个东西很要命,不符合需求,干掉它!

 

 

在Flickcharm::eventFilter里面有如下类似的代码:

case FlickData::Pressed:

            if (mouseEvent->type() == QEvent::MouseButtonRelease) {
                //qDebug() << "1" ;
                consumed = true;
                data->state = FlickData::Steady;
                QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress,
                                                      data->pressPos, Qt::LeftButton,
                                                      Qt::LeftButton, Qt::NoModifier);
                QMouseEvent *event2 = new QMouseEvent(*mouseEvent);
//                qDebug() << "send" << data->pressPos << mouseEvent->pos() ;
                data->ignored << event1;
                data->ignored << event2;
                QApplication::postEvent(object, event1);
                QApplication::postEvent(object, event2);
            }
            if (mouseEvent->type() == QEvent::MouseMove) {

再往后的代码功效很简单,就是当你挪动鼠标的时候就开始进入手动移动状态,如果松开时就开始进入自动滚动,就是开始负加速度滚动。
思路也很简单,如果你按下去了,还给我开始滚了,行,我就让安放在QApplication上的eventFilter吃掉松开事件,有按下没松开,就不是click了!
当然,真正的情况稍微复杂,因为这么做有时按钮就显示成按下状态,恢复不了,所以你得再动动脑筋,让他有release,但是有不在这哥们身上。
这样的话,按钮也松开了,也没被click。


下一个小topic,flickcharm是很强大,支持动力学滚动。但是,人家是为了桌面或者手写笔这种精准环境设计的。手指触摸有啥不同?
你在手指按下,接触到触摸屏时,发生了N次接触,你手指那么粗,肯定每次不能保证都是一个地方啊,虽然芯片也许有防抖,不过也防不住你这么粗的手指头啊。
所以,他发生了mousemove!所以,我们新的需求就是在flickcharm中去抖动。

这个是好久之前做的了,想不全了。不过应该也没问题。
还是刚才的eventFilter函数,其中有个
case FlickData::ManualScroll:
            if (mouseEvent->type() == QEvent::MouseMove) {
                consumed = true;
                QPoint delta = mouseEvent->pos() - data->pressPos;
                setScrollOffset(data->widget, data->offset - delta);
            }
            if (mouseEvent->type() == QEvent::MouseButtonRelease) {

这个地方用来在手动滚动情况下捕捉release事件,以产生动力学滚动的。这个flickcharm在策略上是,如果动力学启动了,就不会再次把事件传递给之前的widget了。
所以我们只要不启动动力学滚动就好了。这个判断了x和y轴上的移动符合一个阈值不,如果在范围内,我就绕过去,不启动动力学滚动,然后事件自然就会被重新传递给widget。
这样,虽然有非常小的移动,但是click还是可以产生的~

by 苍松

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值