您的位置:首页 > 编程语言 > Qt开发

Qt窗体实现类似于PowerPoint 切换页面的推进效果

2013-03-07 00:03 375 查看
如要在下图中弹出另外一个窗体,并且带有窗体逐步推进效果







首先,要想在一个窗体中弹出另外一窗体,只需调用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;
    }
}

注意:在没有给弹出窗体设置父窗体的时候,运用上述方法能解决实际问题。如果给弹出窗体设置了父窗体,弹出窗体的位置就是相对于父窗体而言,这时,就不需要在获取边框栏等宽度了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  QT UI C++ 界面推进效果