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

如要在下图中弹出另外一个窗体,并且带有窗体逐步推进效果













首先,要想在一个窗体中弹出另外一窗体,只需调用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窗体实现类似于PowerPoint 切换页面的推进效果)