该例子在dojo项目(ariya所写)的flickcharm目录下,代码在git服务器上, 下载命令是:
git clone git://gitorious.org/qt-labs/graphics-dojo.git
近期在学习窗体滑动的实现,在网上发现了这一源码,该源码短小精悍,值得一用:
1.该例子的功能是定义了一个FlickCharm类,该类可以给任何从QScrollArea类和QWebView类派生的窗体类添加用鼠标拖动内容的效果。其核心是利用Qt的eventFilter, 首先把FilckCharm注册为窗体类的eventFilter对象, 这样FlickCharm可以优先获得窗体类的鼠标事件,对鼠标事件对行处理并渲染拖动的动画效果。整个例子不过区区三百行的代码(包括注释空行等), 堪称非常精炼, 功能又丝毫不逊色, 很值得一读。(引用http://blog.chinaunix.net/uid-8210028-id-337985.html)
2.把需要滑动的窗体传给FlickCharm的activateOn函数
3.在activateOn函数中,对要滑动的窗体作以下处理:
a. 关闭水平、垂直滚动条。
b. 把FlickCharm注册为滑动窗体的eventFilter对象。
c. 保存滑动窗体的相关信息,信息存在FlickData结构体中。(实现监控多个窗体)
4. FlickCharm::eventFilter函数针对拖动的不同状态处理鼠标事件。
5. 实现拖动和滑动的方法是修改窗体的滚动条的位置。代码如下:
static void setScrollOffset(QWidget *widget, const QPoint &p)
{
QAbstractScrollArea *scrollArea = dynamic_cast(widget);
if (scrollArea) {
scrollArea->horizontalScrollBar()->setValue(p.x());
scrollArea->verticalScrollBar()->setValue(p.y());
}
QWebView *webView = dynamic_cast(widget);
QWebFrame *frame = webView ? webView->page()->mainFrame() : 0;
if (frame)
frame->evaluateJavaScript(QString("window.scrollTo(%1,%2);").arg(p.x()).arg(p.y()));
}