Qt窗体实现类似于PowerPoint 切换页面的推进效果
2013-03-07 00:03
375 查看
如要在下图中弹出另外一个窗体,并且带有窗体逐步推进效果
![](http://img.my.csdn.net/uploads/201303/07/1362586409_2522.png)
![](http://img.my.csdn.net/uploads/201303/07/1362586416_5928.png)
![](http://img.my.csdn.net/uploads/201303/07/1362586470_4486.png)
首先,要想在一个窗体中弹出另外一窗体,只需调用show()方法即可,当然要弹出另外一个窗体应该是QDialog或者它的子类。
为了让窗体显示在QMainWindow的相应位置,我们应该想办法获取预弹出窗体的位置。由于QDialog的弹出位置是相对于桌面而言的,所以,我们可以先通过pos()方法获取QMainWindow的主上角位置,在获取左边窗体部件相对于QMainWindow而言的相对位置。又由于在QMainWindow中,部件的相对起始位置是窗体的内部空白区域的左上角,所以,在计算预弹出窗体的位置时,还应考虑窗体边框栏的宽度和主标题栏的高度。
为了让QDialog没有边框和标题栏,我们设置WindowFlags为Qt::FramelessWindowHint。但是仅仅这样设置,弹出窗体外围仍然又一圈空白区域,这是由于窗体的Margin所造成的。不过如果设置QDialog的Margin为(0,0,0,0),并起不到预想的效果。通过给窗体布局(如QGridLayout),此时设置布局控件的Margin为(0,0,0,0),就能是弹出的窗体没有边框和空白,只有要显示的内容了。
由于QDialog的resize方法可以让窗体大小逐渐变化 ,但是注意,一旦窗体内有一定的内容,并且已经布局正确了的话,注意要把里面所有控件的sizePolicy设置为IgnoreFlag,这样才能保证窗体的内容不会影响窗体的resize效果。
好了,到此,我们只再需要一个定时器,让窗体的大小逐渐变化,即可实现想要的效果了。
关键代码如下:
int
iTitleBarHeight =QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight); //获取标题栏高度
intiFrameWidth =QApplication::style()->pixelMetric(QStyle::PM_MDIFrameWidth);
//获取边框宽度
m_qtimer=newQTimer(this);
connect(m_qtimer,SIGNAL(timeout()),this,SLOT(slotTimerOut()));//绑定定时器消息响应函数
m_qtimer ->start(2); ///启动定时器,0.002秒时间间隔
voidCExtensionDlg::slotTimerOut()
{
if(m_bIsPopup )
{
//弹出窗体
if(m_iPercent>100)
{
m_qtimer->stop();
//m_pPopDialog->setFocus();
return;
}
this ->resize(m_size.width()*m_iPercent/100,m_size.height()
);
this ->move(m_point.x(),m_point.y()
);
this ->show();
m_iPercent += 5;
}else
{
//关闭窗体
if(m_iPercent<1)
{
m_qtimer->stop();
//m_pPopDialog->setupUI();
this->hide();
return;
}
this ->resize(m_size.width()*m_iPercent/100,m_size.height()
);
this ->move(m_point.x(),m_point.y()
);
this->show();
m_iPercent -= 5;
}
}
注意:在没有给弹出窗体设置父窗体的时候,运用上述方法能解决实际问题。如果给弹出窗体设置了父窗体,弹出窗体的位置就是相对于父窗体而言,这时,就不需要在获取边框栏等宽度了。
![](http://img.my.csdn.net/uploads/201303/07/1362586409_2522.png)
![](http://img.my.csdn.net/uploads/201303/07/1362586416_5928.png)
![](http://img.my.csdn.net/uploads/201303/07/1362586470_4486.png)
首先,要想在一个窗体中弹出另外一窗体,只需调用show()方法即可,当然要弹出另外一个窗体应该是QDialog或者它的子类。
为了让窗体显示在QMainWindow的相应位置,我们应该想办法获取预弹出窗体的位置。由于QDialog的弹出位置是相对于桌面而言的,所以,我们可以先通过pos()方法获取QMainWindow的主上角位置,在获取左边窗体部件相对于QMainWindow而言的相对位置。又由于在QMainWindow中,部件的相对起始位置是窗体的内部空白区域的左上角,所以,在计算预弹出窗体的位置时,还应考虑窗体边框栏的宽度和主标题栏的高度。
为了让QDialog没有边框和标题栏,我们设置WindowFlags为Qt::FramelessWindowHint。但是仅仅这样设置,弹出窗体外围仍然又一圈空白区域,这是由于窗体的Margin所造成的。不过如果设置QDialog的Margin为(0,0,0,0),并起不到预想的效果。通过给窗体布局(如QGridLayout),此时设置布局控件的Margin为(0,0,0,0),就能是弹出的窗体没有边框和空白,只有要显示的内容了。
由于QDialog的resize方法可以让窗体大小逐渐变化 ,但是注意,一旦窗体内有一定的内容,并且已经布局正确了的话,注意要把里面所有控件的sizePolicy设置为IgnoreFlag,这样才能保证窗体的内容不会影响窗体的resize效果。
好了,到此,我们只再需要一个定时器,让窗体的大小逐渐变化,即可实现想要的效果了。
关键代码如下:
int
iTitleBarHeight =QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight); //获取标题栏高度
intiFrameWidth =QApplication::style()->pixelMetric(QStyle::PM_MDIFrameWidth);
//获取边框宽度
m_qtimer=newQTimer(this);
connect(m_qtimer,SIGNAL(timeout()),this,SLOT(slotTimerOut()));//绑定定时器消息响应函数
m_qtimer ->start(2); ///启动定时器,0.002秒时间间隔
voidCExtensionDlg::slotTimerOut()
{
if(m_bIsPopup )
{
//弹出窗体
if(m_iPercent>100)
{
m_qtimer->stop();
//m_pPopDialog->setFocus();
return;
}
this ->resize(m_size.width()*m_iPercent/100,m_size.height()
);
this ->move(m_point.x(),m_point.y()
);
this ->show();
m_iPercent += 5;
}else
{
//关闭窗体
if(m_iPercent<1)
{
m_qtimer->stop();
//m_pPopDialog->setupUI();
this->hide();
return;
}
this ->resize(m_size.width()*m_iPercent/100,m_size.height()
);
this ->move(m_point.x(),m_point.y()
);
this->show();
m_iPercent -= 5;
}
}
注意:在没有给弹出窗体设置父窗体的时候,运用上述方法能解决实际问题。如果给弹出窗体设置了父窗体,弹出窗体的位置就是相对于父窗体而言,这时,就不需要在获取边框栏等宽度了。
相关文章推荐
- android 移动开发 手势切换页面实现动画效果
- Android使用TabLayou+fragment+viewpager实现滑动切换页面效果
- QT实现类似于网页step 菜单效果
- Qt使用QGraphicsView实现滑动窗体效果
- Fragment+RadioButton实现点击切换页面效果
- js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
- 过渡形式实现翻转切换页面的效果
- JQuery页面图片切换和新闻列表滚动效果的具体实现
- vue实现app页面切换动画效果实例
- 实现微博个人页面的滑块浮动切换页面效果(OC)
- JQuery页面图片切换和新闻列表滚动效果的具体实现
- Gallery实现ViewPager的页面切换效果、以及实现图片画廊效果
- Fragment+RadioButton实现点击切换页面效果
- ViewPager实现滑屏切换页面及动画效果(仿优酷客户端)
- android ViewPager实现页面左右切换效果
- 总结:三种方式实现单击页签切换页面效果
- 用Fragment实现Tab页面切换效果初步总结
- Android 左右滑动切换页面或Activity的效果实现
- 基于Qt的多窗口设计-窗体切换的实现
- Android 利用ViewPager实现底部圆点导航左右滑动效果以及Fragment页面切换