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()));}
相关文章推荐
- 拖动窗体实现移动窗体
- MFC在鼠标自定义的一定的范围内实现拖动窗口移动、错误:不支持尝试执行的操作、实现进度条颜色的渐变或者背景和前景色的改变
- 运行期窗体、可视组件任意移动 调整大小功能实现组件
- Qt如何实现子部件在父部件上移动拖动
- C#无边框窗体实现以及拖动代码
- delphi xe 窗体子控件实现窗体拖动
- 用Qt实现窗体的无边框、可移动、透明不规则显示(需背景透明的图片)
- DataGrid实现(上下左右移动,添加删除行列,导出,表头拖动)
- 关于拖动(实现窗体拖动、不允许窗体拖动、任意控件运行时拖动)
- 实现无边框窗体的拖动及窗体大小变化
- winform中主窗体可以实现拖动代码
- C#实现窗体拖动、不允许窗体拖动、任意控件运行时拖动
- C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化
- 基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
- 『WPF』实现拖动文件到窗体(控件)
- C#实现控件随窗体拖动而自动缩放其大小
- C#实现无边框窗体拖动
- 实现射线检测鼠标拖动物体移动和使用滑轮缩放物体
- C#之移动无标题栏窗体功能的实现!...
- qt 拖动子窗体,父窗体同时移动