qt 实现轮播图

这个是为了编写我网易云项目中轮播图的效果,目前移动动画有点问题,后期把功能给加上。

采用了QGraphicsScene  、QGraphicsView、QGraphicsPixmapItem的方式,参考了网上博主

https://blog.csdn.net/h391998495979/article/details/101868838

然后自己采用了map 关联了button 与 图片的连接。 

主要代码:

#include "picturewidget.h"
#include "ui_picturewidget.h"
#include "pictureitem.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
static int dir = 0;//记录方向
static QList spaceList;
static QList unitList;
static QList transScaleList;//缩放比例表
static QSize pictrueBigSize = RAW_VIEW_SIZE/SCALE_VIEW_PIXMAP;
static QSize pictrueSmallSize = RAW_VIEW_SIZE/SCALE_VIEW_PIXMAP/SCALE_BIG_SMALL;
static QList itemList;
static QList finishList;
static QMap mapLink;  //按钮id 与 图片资源的映射
static int startNum = 0;PictureWidget::PictureWidget(QWidget *parent) :QWidget(parent),ui(new Ui::PictureWidget),m_timer(new QTimer(this)),m_scene(new QGraphicsScene(this)),m_index(0),m_currentRule(RuleA),m_rollCount(0),btnMoveEnable(true)
{ui->setupUi(this);setButtonGroup(); //设置按钮组setInitList();setPictureScreen();setTimerAndConnect();
}PictureWidget::~PictureWidget()
{delete ui;
}void PictureWidget::setButtonGroup()
{m_BtnGroup = new QButtonGroup(this);m_BtnGroup->addButton(ui->btnPic0,0);m_BtnGroup->addButton(ui->btnPic1,1);m_BtnGroup->addButton(ui->btnPic2,2);m_BtnGroup->addButton(ui->btnPic3,3);m_BtnGroup->addButton(ui->btnPic4,4);m_BtnGroup->addButton(ui->btnPic5,5);m_BtnGroup->addButton(ui->btnPic6,6);m_BtnGroup->addButton(ui->btnPic7,7);m_BtnGroup->addButton(ui->btnPic8,8);m_BtnGroup->addButton(ui->btnPic9,9);m_BtnGroup->setExclusive(true);m_BtnGroup->button(1)->setChecked(true);for (int i = 0; i<10; i++) {static_cast(m_BtnGroup->button(i))->setId(i);}
}void PictureWidget::setInitList()
{m_PointList << P1 << P2<< P3 << P4 << P5 << P6 << P7 << P8 << P9 << P10;m_ZValueList << 1 << 2 << 1  << 0  << 0  << 0  << 0  << 0  << 0  << 0;m_PixmapScaleList << 0.8<< 1 << 0.8 << 0.8 << 0.8 << 0.8 << 0.8 << 0.8 << 0.8 <<0.8;
}void PictureWidget::setPictureScreen()
{//设置样式 无标边框ui->graphicsView->setStyleSheet("background: transparent; padding: 0px; border: 0px;");ui->graphicsView->setScene(m_scene);m_scene->setSceneRect(0,0,RAW_VIEW_SIZE.width(),RAW_VIEW_SIZE.height());m_MidLine.setPoints(QPointF(0,0),\QPointF(RAW_VIEW_SIZE.width(),0));//添加对应图片for (int i = 1; i<=10;i++) {m_PixmapList.append(QPixmap(QString(":/picturewall/%1.png").arg(i)));}for (int i = 0; i<10;i++) {itemList.append(new pictureItem(m_PixmapList[i].scaled(pictrueBigSize,Qt::KeepAspectRatio,Qt::SmoothTransformation)));itemList[i]->setScale(m_PixmapScaleList[i]);itemList[i]->setType(i);itemList[i]->setItemId(i);itemList[i]->setOffset(QPointF(0,0));}//图元添加图片for(int i = 0; i<10; i++){m_scene->addItem(itemList[i]);//添加图元itemList[i]->setPos(m_MidLine.pointAt(m_PointList[i]));//设置位置itemList[i]->setZValue(m_ZValueList[i]);//设置显示优先级itemList[i]->setTransformationMode(Qt::SmoothTransformation);//设置缩放模式if(i != 1){itemList[i]->setPos(itemList[i]->x(),RAW_VIEW_SIZE.height()/10);}}//放入映射map中for(int i =0; i<10; i++){mapLink.insert(static_cast(m_BtnGroup->button(i))->id(),itemList[i]);}QMap::const_iterator it;for (it = mapLink.constBegin();it!=mapLink.constEnd();it++) {qDebug()<< it.key()<< ": " << it.value();}}void PictureWidget::setTimerAndConnect()
{//利用持续时间和帧数计算出定时时间,持续时间/(帧数*持续时间),这里乘1000是转为秒m_timer->setInterval(DURATION_MS/(FPS*DURATION_MS/1000));connect(m_timer,&QTimer::timeout,this,&PictureWidget::timerOutFunc);for(int i = 0; i<10; i++){connect(itemList[i],&pictureItem::clickedId,this,&PictureWidget::clickedItemRoll);void (pictureButton:: *funcPtr)(int) = &pictureButton::entered;connect(static_cast(m_BtnGroup->button(i)),funcPtr,[this](int id){pictureItem * p = mapLink.value(id); //获取id 的图片值btnMoveEnable = false;clickedItemRoll(p->type());qDebug()<type();});}}int PictureWidget::getIndexByRules(int oldIndex, int rule)
{switch (rule) {case 1:return  (oldIndex+1)/10;case -1:return oldIndex==0?9:oldIndex-1;default:return 0;}}void PictureWidget::rollItem(int rollDir, unsigned rollCount)
{if(m_timer->isActive())return;//获取新的数据//主要位置  主位置int nbegin = rollDir;startNum = getrightN(nbegin);m_timer->start();
}int PictureWidget::getrightN(int num)
{if(num == -1){num = 9;}if(num == 10){num = 0;}return num;
}void PictureWidget::timerOutFunc()
{
//    on_btnR_clicked();int first = getrightN(startNum-1);for (int i = 0; i<10; i++) {itemList[i] = mapLink.value(first%10);first++;itemList[i]->setScale(m_PixmapScaleList[i]);itemList[i]->setPos(m_MidLine.pointAt(m_PointList[i]));//设置位置//itemList[i]->moveBy(m_MidLine.pointAt(m_PointList[i]).x(),m_MidLine.pointAt(m_PointList[i]).y());itemList[i]->setZValue(m_ZValueList[i]);//设置显示优先级itemList[i]->setTransformationMode(Qt::SmoothTransformation);//设置缩放模式if(i != 1){itemList[i]->setPos(itemList[i]->x(),RAW_VIEW_SIZE.height()/10);}}m_scene->invalidate();m_timer->stop();
}void PictureWidget::clickedItemRoll(int type)
{if(m_timer->isActive())return;rollItem(type, 0); //得到最新的id 按钮位置
}//左边运动
void PictureWidget::on_btnL_clicked()
{int id = m_BtnGroup->checkedId();if(id-1<0){id = 9;}else {id = id -1;}m_BtnGroup->button(id)->setChecked(true);rollItem(id,0);
}
//右边运动
void PictureWidget::on_btnR_clicked()
{int id = m_BtnGroup->checkedId();id = (id+1)%10;m_BtnGroup->button(id)->setChecked(true);rollItem(id,0);
}template
void PictureWidget::rollList(QList &oldList, int dir, int count)
{for(int i = 0; i

需要的例子的可以关注,私聊我,后期有时间上传上去。 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部