关于QStackedWidget

最近做个东西,想实现全屏滚动的功能。架构选择的是QtWidget那一套,并不支持滚动,但是在symbian上,稳定、成熟。
以前曾经有些积累,有个东西叫FlickCharm,是一个QtBlog的人写的,可以让QAbstractScrollArea或者QWebView支持基于手势的,动力学滚动。

首先,想用这个东西需要满足下列条件。

1. 没有人跟你抢滚动区域中的Mouse事件(Button就会抢,QLabel都会,如果不想,可以设置为NoTextInteraction)

2. 暂时忘了

 

写啊写啊,终于发现,怎么都得放点别的东西到上面,起码Button是必须的…………

sorry,扯远了,和这个topic没大关系,说有关的。

 

 

好,回到stackedwidget,这个东西是为了桌面设计的,而且有一些潜规则,譬如:

这东西可以放很多“页”widget,但是stackedwidget的整体高度将取决于最高的那一页的高度。

 

然后,回到我说的这个项目,当有很多页的时候,我可不想每一页都弄个scrollarea,这样太2了,然后整个弄了个scrollarea,把stackedwidget装了进去,问题就出现了。

 

有的页长,有的短,短的下面就是大片大片的空白……

 

我花了周日一下午,外搭晚上2个小时,一直在研究这个问题。后来发现了解决方案。当然,无法做到完全的接口兼容,虽然可以做,不过会破坏设计原则。

1. 添加一个public api叫setCurrentPageIndex(),名称来源于setCurrentIndex,一样的功能,不过这个新的api将符合我的需求

2. 新api肯定还是调用setCurrentIndex,但是,有些小技巧。

 

a. 需求,每一个page只有一个子widget,你可以给他取名叫xxPageContainer,然后你得确保我们这个AdvancedStackedWidget能通过page找到他的container。 我这添加了一个registerPageContainer的api,就是为了将他们的映射注册到hash表里面。

b.在setCurrentPageIndex里面,执行流程是:

- 隐藏当前pageContainer

- 隐藏当前page

- 换page,用setCurrentIndex

- 显示当前page

- 显示当前page的Container

 

OK,这回就可以根据当前页改变大小了。

 

如果你是懒人,如果你愿意冒风险,可以直接将AdvancedStackedWidget的setCurrentpageIndex方法取名为setCurrentIndex,这将导致通过ASW指针访问这个方法时调用你修改过的版本,在designer里面直接promote一个StackedWidget为ASW,然后估计也没有问题,但是,这样会破坏设计原则。

 

by 苍松

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值