Qt使用QGraphicsView实现滑动窗体效果

 源码已上传至CSDN,http://download.csdn.net/source/2808505

 

QGraphicsView用来显示一个滚动视图区的QGraphicsScene内容。QGraphicsScene提供了QGraphicsItem的容器功能。通常与QGraphicsView一起使用来描述可视化图形项目。

 

QGraphicsScene提供了一个视图的场景,通过在这样一个场景之上加入不同的QGraphicsItem来构建视图。而QGraphicsView则提供了一个widget来显示QGraphicsScene的内容。所以要想成功构建一个视图,这三个元素缺一不可。

 

以下是一个QGraphicsView的例子,实现滑动的窗体效果,工具栏和图片均为场景中的Item。

 

 

 

 

[cpp]  view plain copy
  1. #include <QtCore>  
  2. #include <QtGui>  
  3. #include <QtSvg>  
  4. /*程序中用到了svg格式的图片,所以需包含QtSvg*/  
  5. #define PAGE_COUNT 5  
  6. /*定义滑动窗体的窗体数*/  

 

 

 

定义工具栏,NviBar继承自QGraphicsRectItem,用法与QGraphicsItem类似。

 

[cpp]  view plain copy
  1. class NaviBar : public QObject, public QGraphicsRectItem  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     NaviBar();  
  6.     void setPageOffset(qreal ofs);  
  7. signals:  
  8.     void pageSelected(int page);  
  9. protected:  
  10.     void mousePressEvent(QGraphicsSceneMouseEvent *event);  
  11.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);  
  12. private:  
  13.     QList<QGraphicsSvgItem*> m_icons;  
  14.     QGraphicsRectItem *m_cursor;  
  15. };  

 

 

 

函数实现

 

[cpp]  view plain copy
  1. #define ICON_SIZE 50  
  2. #define ICON_PAD 4  
  3. NaviBar::NaviBar()  
  4.         : QGraphicsRectItem()  
  5. {  
  6.     setRect(0, 0, 5 * ICON_SIZE, ICON_SIZE);  
  7.     setPen(Qt::NoPen);  
  8.     QStringList names;  
  9.     names << "map" << "web" << "home" << "weather" << "contacts";  
  10.     for (int i = 0; i < names.count(); ++i) {  
  11.         QString fname = names[i];  
  12.         fname.prepend(":/icons/");  
  13.         fname.append("-page.svg");  
  14.         QGraphicsSvgItem *icon = new QGraphicsSvgItem(fname);  
  15.         icon->setParentItem(this);  
  16.         const int dim = ICON_SIZE - ICON_PAD * 2;  
  17.         qreal sw = dim / icon->boundingRect().width();  
  18.         qreal sh = dim / icon->boundingRect().height();  
  19.         icon->setTransform(QTransform().scale(sw, sh));  
  20.         icon->setZValue(2);  
  21.         m_icons << icon;  
  22.     }  
  23.     m_cursor = new QGraphicsRectItem;  
  24.     m_cursor->setParentItem(this);  
  25.     m_cursor->setRect(0, 0, ICON_SIZE, ICON_SIZE);  
  26.     m_cursor->setZValue(1);  
  27.     m_cursor->setPen(Qt::NoPen);  
  28.     m_cursor->setBrush(QColor(Qt::white));  
  29.     m_cursor->setOpacity(0.6);  
  30. }  
  31. void NaviBar::setPageOffset(qreal ofs)  
  32. {  
  33.     m_cursor->setPos(ofs * ICON_SIZE, 0);  
  34.     for (int i = 0; i < m_icons.count(); ++i) {  
  35.         int y = (i == static_cast<int>(ofs + 0.5)) ? ICON_PAD : ICON_PAD * 2;  
  36.         m_icons[i]->setPos(i * ICON_SIZE + ICON_PAD, y);  
  37.         m_icons[i]->setOpacity(1);  
  38.     }  
  39. }  
  40. void NaviBar::mousePressEvent(QGraphicsSceneMouseEvent *event)  
  41. {  
  42.     emit pageSelected(static_cast<int>(event->pos().x() / ICON_SIZE));  
  43. }  
  44. void NaviBar::paint(QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget)  
  45. {  
  46.     painter->setBrush(Qt::white);  
  47.     painter->setOpacity(0.2);  
  48.     painter->drawRect(option->rect.adjusted(-20, ICON_PAD, 20, 0));  
  49. }  

 

 

 

 

定义视图

 

[cpp]  view plain copy
  1. class ParallaxHome: public QGraphicsView  
  2. {  
  3.  
  4. };  

 

 

 

main函数

 

[cpp]  view plain copy
  1. #include "parallaxhome.moc"  
  2. int main(int argc, char *argv[])  
  3. {  
  4.     QApplication app(argc, argv);  
  5.     ParallaxHome w;  
  6.     w.resize(360, 640);  
  7.     w.show();  
  8.     return app.exec();  
  9. }  

 

 

 

效果图

本文来源:http://blog.csdn.net/huihui1988/article/details/5725955

你可能感兴趣的:(窗口,qt,滑动)