最近做个东西,想实现全屏滚动的功能。架构选择的是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 苍松