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;}