Qt轮播图的实现代码,供大家参考,具体内容如下
qt轮播图简单的实现,功能会在后面完善
效果图:

这里我是用了QGraphicsScene+QGraphicsView+QGraphicsObject,其中对QGraphicsView和QGraphicsObject进行继承派生类功能进行了添加。时间有限,直接贴上关键代码部分供大家参考。
//pictrueitem.h
#ifndef PICTRUEITEM_H
#define PICTRUEITEM_H
#include <QGraphicsPixmapItem>
#include <QGraphicsItem>
#include <QGraphicsObject>
#include <QPixmap>
class PictrueItem : public QGraphicsObject
{
Q_OBJECT
public:
explicit PictrueItem(QGraphicsItem *parent = Q_NULLPTR);
explicit PictrueItem(const QPixmap &pixmap, QGraphicsItem *parent = Q_NULLPTR);
virtual ~PictrueItem();
void setPixmap(const QPixmap &pixmap);
QPixmap pixmap() const;
virtual QRectF boundingRect() const;
void setTransformationMode(Qt::TransformationMode mode);
QPointF offset() const;
void setOffset(const QPointF &offset);
virtual int type()const;
void setType(int type);
int itemId()const;
void setItemId(int id);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
Q_SIGNALS:
void clicked();
void clickedId(int);
private:
QPointF pressedScenePoint;
QPointF m_offset;
QPointF m_pos;
Qt::TransformationMode mode;
QPixmap m_pixmap;
bool isPressed;
int m_type;
int m_id;
qreal m_pointPercent;
};
#endif // PICTRUEITEM_H
//pictrueitem.cpp
#include "pictrueitem.h"
#include <QGraphicsSceneMouseEvent>
#include <QPainter>
#include <QDebug>
PictrueItem::PictrueItem(QGraphicsItem *parent)
:QGraphicsObject(parent),
isPressed(false),
mode(Qt::SmoothTransformation),
m_type(0),
m_id(0),
m_pointPercent((qreal)0.0)
{
}
PictrueItem::PictrueItem(const QPixmap &pixmap, QGraphicsItem *parent)
:QGraphicsObject(parent),
isPressed(false),
mode(Qt::SmoothTransformation),
m_type(0)
{
m_pixmap = pixmap;
}
PictrueItem::~PictrueItem()
{
}
void PictrueItem::setPixmap(const QPixmap &pixmap)
{
prepareGeometryChange();
m_pixmap = pixmap;
update();
}
QPixmap PictrueItem::pixmap() const
{
return m_pixmap;
}
QRectF PictrueItem::boundingRect() const
{
if(m_pixmap.isNull())
return QRectF();
return QRectF(m_offset, m_pixmap.size() / m_pixmap.devicePixelRatio());
}
void PictrueItem::setTransformationMode(Qt::TransformationMode mode)
{
if (mode != this->mode)
{
this->mode = mode;
update();
}
}
QPointF PictrueItem::offset() const
{
return m_offset;
}
void PictrueItem::setOffset(const QPointF &offset)
{
m_offset = offset;
if (m_offset == offset)
return;
prepareGeometryChange();
m_offset = offset;
update();
}
int PictrueItem::type() const
{
return m_type;
}
void PictrueItem::setType(int type)
{
m_type = type;
}
int PictrueItem::itemId() const
{
return m_id;
}
void PictrueItem::setItemId(int id)
{
m_id = id;
}
void PictrueItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
//只响应鼠标左键
if(event->button() == Qt::LeftButton)
{
pressedScenePoint = event->pos();
isPressed = true;
}
}
void PictrueItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
if(isPressed &&
boundingRect().contains(event->pos()) &&
boundingRect().contains(pressedScenePoint))
{
isPressed = false;
emit clicked();
emit clickedId(type());
}
}
}
void PictrueItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget);
Q_UNUSED(option);
painter->setRenderHint(QPainter::SmoothPixmapTransform,
(this->mode == Qt::SmoothTransformation));
painter->drawPixmap(m_offset, m_pixmap);
}










