状态切换按钮
我们之前制作过按钮类为PicButton,但是这次我们要制作另外一个按钮类,主要是实现状态切换,比如当前是播放状态,那么按钮就显示出暂停的图标,点击暂停后切换为播放的图标。同时还要支持滑动,点击,正常的三种效果。
PicStateBtn构造函数
1 | PicStateBtn::PicStateBtn(QWidget *parent ):QPushButton (parent){ |
添加一个函数设置播放状态和暂停状态的图标
1 | void PicStateBtn::SetIcons(const QString &normal, const QString &hover, const QString &pressed, |
normal,hover,pressed分别表示播放状态正常,悬浮,点击的效果。
_normal_2,_hover_2,_pressed_2分别表示暂停状态正常,悬浮,点击的效果。
_cur_state表示现在是上述六种状态的哪一种,具体定义在const.h文件里
1 | enum PicBtnState { |
对应的我们实现了六种状态的加载函数
1 | void PicStateBtn::setNormalIcon(){ |
接下来实现鼠标滑动,点击,以及正常效果的切换,我们重写event
1 | bool PicStateBtn::event(QEvent *event) |
上述根据现在是播放状态还是暂停状态,再根据鼠标事件设置图标。
另外我们需要实现开始和暂停的切换效果,所以新增两个槽函数
1 | void PicStateBtn::SlotStart() |
我们回到SlideShowDlg.ui文件,将playBtn升级为PicStateBtn。
然后在SlideShowDlg的构造函数里为按钮设置图标,并且将PicAnimationWid的SigStart和SigStop信号与之连接起来
1 | ui->playBtn->SetIcons(":/icon/play.png",":/icon/play_hover.png",":/icon/play_press.png", |
这样动画一开始按钮就被设置为暂停图标,表示动画正在运行,点击暂停图标又会切换为运行图标,表示动画已经暂停。
关闭按钮
SlideShowDlg的关闭按钮比较影响体验,我们隐藏边框上的按钮,在构造函数里添加
1 | this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint); |
升级SlideShowDlg的ui文件中的closeBtn为PicButton,并且在构造函数里添加加载图标的逻辑和信号连接。
1 | ui->closeBtn->SetIcons(":/icon/closeshow.png",":/icon/closeshow_hover.png", |
这样就能响应关闭按钮的事件了。
切换跳转
我们需要点击向前和向后按钮,实现动画图片的切换,这里先升级SlideShowDlg的ui文件中的slidenextBtn和slidpreBtn按钮为PicButton
然后在构造函数添加加载逻辑和信号连接
1 | ui->slidpreBtn->SetIcons(":/icon/previous.png", |
这两个槽函数内部调用了PicAnimationWid的SlideNext和SlidePre
1 | void SlideShowDlg::SlotSlideNext() |
PicAnimationWid的两个函数分别实现图片的切换
1 | void PicAnimationWid::SlideNext() |
切换后动画暂停,变为显示图片的状态。
为了美观,我们完善一下qss
1 | #preListWidget { |
将按钮设置为无边框,然后设置了preListWidget的边框和边距等信息。
添加音乐
为了让动画播放过程中能够播放音乐,我们在mainwindow的菜单里添加音乐菜单。
1 | //设置背景音乐动作 |
在打开音乐的槽函数里弹出一个文件夹对话框
1 | void ProTreeWidget::SlotSetMusic(bool) |
文件夹对话框返回选择的文件列表,我们将文件列表加入播放列表_playlist。然后通过判断_player的状态设置索引。
_player为QMediaPlayer类型,_playlist为QMediaPlaylist类型,我们需要在pro里添加multimedia才能使用。
1 | QT += core gui multimedia |
另外要在protreewidget头文件包含
1 |
然后在SlideShowDlg的构造函数添加播放音乐和停止音乐的槽函数
1 | //连接音乐启动信号 |
播放音乐和停止音乐逻辑很简单
1 | void ProTreeWidget::SlotStartMusic() |
到此为止就完成了动画播放的所有逻辑,这里是整体效果图