滑动界面之slidingSatckWidget

stack滑动窗口界面

 窗口滑动界面相对于普通的stackWidget窗口管理多了一些动画效果,可以让界面看起来更加酷炫,源码在文章末尾 。如图;
在这里插入图片描述

滑动窗口的原理

  滑动stackwidget的本质就是采用动画效果修饰widget的pos属性,同时移动前后的两个widget的位置,等动画完成之后,最后隐藏前一个widget。整个滑动的效果就达到啦。
核心代码如下:

void SlidingStackedWidget::slideInWgt(QWidget * newwidget,SlideDirection  direction) {
    
	if (m_active) {  //控制下是否需要滑动
        return;
	}

	else m_active=true;

	enum SlideDirection directionhint;
    int now=currentIndex();
	int next=indexOf(newwidget);
	if (now==next) {
		m_active=false;
		return;
	}
	else if (now<next){
		directionhint=m_vertical ? TopToBottom : RightToLeft;
	}
	else {
		directionhint=m_vertical ? BottomToTop : LeftToRight;
	}
	if (direction == Automatic) {
		direction=directionhint;
	}
    
    //获得frame的size 
    int offsetx=frameRect().width();
    int offsety=frameRect().height();
    
//resize新的widget
	widget(next)->setGeometry ( 0,  0, offsetx, offsety );
   
//根据移动的方向模式,计算出偏移量
	if (direction == BottomToTop)  {
		offsetx=0;
		offsety=-offsety;
	}
	else if (direction == TopToBottom) {
		offsetx=0;
		//offsety=offsety;
	}
	else if (direction == RightToLeft) {
		offsetx=-offsetx;
		offsety=0;
	}
	else if (direction == LeftToRight) {
		//offsetx=offsetx;
		offsety=0;
	}
	QPoint pnext=widget(next)->pos();
	QPoint pnow=widget(now)->pos();
	m_pnow=pnow;

//移动,显示新的widget
	widget(next)->move(pnext.x()-offsetx,pnext.y()-offsety);
	widget(next)->show();
	widget(next)->raise();

//初始化动画
	QPropertyAnimation *animnow = new QPropertyAnimation(widget(now), "pos");
	animnow->setDuration(m_speed);
	animnow->setEasingCurve(m_animationtype);
	animnow->setStartValue(QPoint(pnow.x(), pnow.y()));
	animnow->setEndValue(QPoint(offsetx+pnow.x(), offsety+pnow.y()));

	QPropertyAnimation *animnext = new QPropertyAnimation(widget(next), "pos");
	animnext->setDuration(m_speed);
	animnext->setEasingCurve(m_animationtype);
	animnext->setStartValue(QPoint(-offsetx+pnext.x(), offsety+pnext.y()));
	animnext->setEndValue(QPoint(pnext.x(), pnext.y()));

	QParallelAnimationGroup *animgroup = new QParallelAnimationGroup;

	animgroup->addAnimation(animnow);
	animgroup->addAnimation(animnext);

	QObject::connect(animgroup, SIGNAL(finished()),this,SLOT(animationDoneSlot()));
	m_next=next;
	m_now=now;
	m_active=true;
	animgroup->start();
}
void SlidingStackedWidget::animationDoneSlot(void) {
    setCurrentIndex(m_next);
//移动隐藏之前的widget
	widget(m_now)->hide();
	widget(m_now)->move(m_pnow);
	m_active=false;
	emit animationFinished();
}

滑动窗口demo源码链接
以上就是滑动窗口界面的核心内容啦。
                       来自一只快乐的马里奥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值