不知道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 苍松