|
本帖最后由 cainiaoqter 于 2014-8-11 19:47 编辑
通过两三周的努力,终于做出了想要的结果,非常感谢QQ群中“傲天雪”同学的帮助,感谢他推荐yafei老师的入门教程,通过看入门教程,有了基本的设计思路,下面两幅图是我的实现效果;我上面想要的效果基本都实现了,下面我简单说一下我的思路;
1、左边的list用ViewList实现,然后将其作为一个widget放入scrollarea1;
2、右边上半部分的刻度是一部分,下面的绘点区域是一部分;
刻度部分和绘点部分的原理相同,都是自己定义一个widget类,然后在其中定义一个pixmap,然后在pixmap中绘图,最后将pixmap绘制到widget中,最后将这个widget放入scrollarea中;
记刻度部分的scrollarea为scrollarea2,绘点部分的为scrollarea3;
3、将右面分成两部分的原因就是,为了在拉动垂直滚动条的时候能够保证刻度一直显示在外面,就像下面第二幅图一样;
4、整个程序中有两个地方需要联动,一个是scrollarea1和scrollarea3的垂直滚动条,保证期同步,这样list中的元素就可以和右边的帧序列保持对应关系,并且能够垂直滚动;
另一个滚动式scrollarea2和scrollarea3的水平滚动,这样就可以水平查看完整的帧序列,而且刻度还可以跟随着移动;
5、关于上面的联动,实现方法是给其中的滚动条添加响应槽函数,在其值改变的时候,设置和其关联的滚动条也处于相同的值:
connect(manageScrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(manageScrollAreaVerticalScrollBarValueChanged(int)));
6、在画图方面,我使用了双缓冲技术,其实在程序中用了更多的画布,目的就是讲我的绘图元素分层,也使得绘制更流畅,具体大家可以参考双缓冲的实现方式。
7、关于拖动其中的小圆点这个功能还没有做,但是感觉不难做,在鼠标响应事件函数中写逻辑即可;
8、关于播放动画功能,我的实现方式是,当黄线位于当前视窗中的时候直接绘制界面即可,当黄线超出当前视窗时,需要移动滚动条使得黄线显示在当前视窗中,具体的值需要计算,都是通过坐标来计算的,也很简单。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|