天天看點

QT實作螢幕滑動效果窗體

QT實作螢幕滑動效果窗體

分類: 2010年 2010-09-09 22:51  1301人閱讀  評論(2)  收藏  舉報

class CScrollScreenView : public QGraphicsView

{      
Q_OBJECT      
public:      
CScrollScreenView(QGraphicsScene *pScene, QWidget *parent);      
//設定試圖的布局      
virtual void SetLayout(QGraphicsLayout *pLayout);      
//設定滾動完成的時間,機關:ms      
void SetAnimationDuration(int msecs)      
{      
m_AnimationDuration = msecs;      
}      
//設定滾動的距離,機關:像素      
void SetScrollDist(int dist)      
{      
m_ScrollDist = dist;      
}      
//在父窗體上按場景位置顯示試圖      
virtual void ShowView()      
{      
this->show();      
}      
private:      
int m_AnimationDuration;    //螢幕滾動動畫控件      
int m_ScrollDist;           //螢幕滾動的距離      
protected:      
void resizeEvent(QResizeEvent *event)      
{      
QGraphicsView::resizeEvent(event);      
fitInView(sceneRect(), Qt::KeepAspectRatio);      
}      
//功能:滾動m_pForm指向的視圖視窗      
//參數:LeftScroll為true則是向左滾動,否則是向右滾動;dist是滾動的距離      
virtual void AnimationForm(bool LeftScroll, int dist);      
QWidget *m_pParent;      
bool m_f_PressMouse;      
QPoint m_StartDragPos;      
QPoint m_ScrollStartPos;      
QGraphicsWidget *m_pForm;      
QGraphicsScene *m_pScene;      
protected slots:      
virtual void mousePressEvent(QMouseEvent *event);      
virtual void mouseReleaseEvent(QMouseEvent *event);      
};      
CScrollScreenView::CScrollScreenView(QGraphicsScene *pScene, QWidget *parent)       
:QGraphicsView(pScene, parent)      
{      
m_pScene = pScene;      
m_pForm = new QGraphicsWidget();      
m_pParent = parent;      
m_f_PressMouse = false;      
m_ScrollStartPos = QPoint(0, 0);      
m_AnimationDuration = 1000;      
m_ScrollDist = 100;      
setBackgroundBrush(QBrush(QColor(0,0,0)));      
}      
void CScrollScreenView::SetLayout(QGraphicsLayout *pLayout)      
{      
m_pForm->setLayout(pLayout);      
m_pScene->addItem(m_pForm);      
pLayout->updateGeometry();      
qreal left = 0, top = 0, right = 0, bottom = 0;      
m_pForm->getContentsMargins(&left, &top, &right, &bottom );      
printf("l=%f,t=%f,r=%f,b=%f/n", left,top,right,bottom);      
printf("w=%f,h=%f/n", m_pForm->size().width(),m_pForm->size().height());      
}      
void CScrollScreenView::AnimationForm(bool LeftScroll, int dist)      
{      
if(!LeftScroll)      
{      
QPropertyAnimation *animation = new QPropertyAnimation(m_pForm, "pos");      
animation->setDuration(m_AnimationDuration);      
animation->setStartValue(m_ScrollStartPos);      
m_ScrollStartPos.setX(m_ScrollStartPos.x() + dist);      
animation->setEndValue(m_ScrollStartPos);      
animation->setEasingCurve(QEasingCurve::Linear);      
animation->start();      
}      
else if(LeftScroll)      
{      
QPropertyAnimation *animation = new QPropertyAnimation(m_pForm, "pos");      
animation->setDuration(m_AnimationDuration);      
animation->setStartValue(m_ScrollStartPos);      
m_ScrollStartPos.setX(m_ScrollStartPos.x() - dist);      
animation->setEndValue(m_ScrollStartPos);      
animation->setEasingCurve(QEasingCurve::Linear);      
animation->start();      
}      
}      
void CScrollScreenView::mousePressEvent(QMouseEvent *event)      
{      
QGraphicsView::mousePressEvent(event);      
m_f_PressMouse = true;      
m_StartDragPos = event->pos();      
}      
void CScrollScreenView::mouseReleaseEvent(QMouseEvent *event)      
{      
QGraphicsView::mouseReleaseEvent(event);      
if(m_f_PressMouse)      
{      
QPoint end_pos = event->pos();      
if(qAbs(end_pos.x() - m_StartDragPos.x()) >= 10)      
{      
if(end_pos.x() < m_StartDragPos.x())      
{      
AnimationForm(true, m_ScrollDist);      
}      
else if(end_pos.x() > m_StartDragPos.x())      
{      
AnimationForm(false, m_ScrollDist);      
}      
}      
}      
m_f_PressMouse = false;      
}      

繼續閱讀