您的位置:首页 > 其它

FlickCharm类的理解,实现窗体的移动与拖动

2014-03-20 11:28 204 查看
该例子在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()));}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: