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



该例子在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()));
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值