当前位置: 首页 > news >正文

QT项目-仿QQ音乐的音乐播放器(第二节)

目录

自定义控件:

BtForm类中实现

BtForm上的动画效果


自定义控件:

该控件实际由:图⽚、⽂字、动画三部分组成。图⽚和⽂字分别⽤QLabel展⽰,动画部分内部实际为4
个QLabel。
① 将BtForm的geometry的宽度和⾼度修改为200*35。
② 拖⼀个Widget到btForm中,objectName修改为btStyle,将btForm的margin和Spacing设置为0.
③ 拖2个QLable和1个Widget到btStyle中,并将objectName依次修改为btIcon、btText、lineBox
btIcon的minimumSize和maximumSize的宽度设置为30(为了看到效果可将颜⾊设置为red)
btText的minimumSize和maximumSize的宽度设置为90(为了看到效果可将颜⾊设置为green)
lineBox的minimumSize和maximumSize的宽度设置为30
然后选中btStyle,并将其margin和Spacing设置为0
④ 然后往lineBox内部拖4个QLabel,objectName依次修改为line1、line2、line3、line4,
minimumSize和 maximumSize的宽度均设置为2
一般调整格式的三板斧就是放widget或者label等各种元素,然后水平或者垂直布局,最后设置minimumSize和maximumSize的高宽,margin和Spacing设置为0。再者就是QSS样式表。
然后将bodyLeft内部onlineMusic和MyMusic中的QWidget全部提升为BtForm自定义类
然后变成这样的界面:

BtForm类中实现

设置按钮上的图片和文字信息,以及该按钮关联的page页面
BtForm.h:int id=0;BtForm.cpp:void BtForm::section(QString btIcon, QString content, int mid)
{ui->btIcon->setPixmap(QPixmap(btIcon));ui->btText->setText(content);this->id=mid;
}

然后在QQMusic的初始化函数里调用这里的section函数输入文本图片和id:

void BtForm::section(QString btIcon, QString content, int mid)
{ui->btIcon->setPixmap(QPixmap(btIcon));ui->btText->setText(content);this->id=mid;
}

博主在做的时候遇到了一个问题:

btform类在面板显示的时候没有hover和点击的背景色,后来经过调整,发现是被QLabel覆盖了,因此要在btsyle中提前设置让它下面的QLabel全部透明,然后在clearbg函数中也加上这一句,同理在mousePressEvent中也加上透明,然后还要在clearbg函数中将linebox设置透明放置鼠标放置在上面的时候背景不是灰色的。还有一个方法是将btsyle下所有控件的背景色都设置为透明。

最后效果是这样的:

BtForm上的动画效果

btform.hQPropertyAnimation *line1Animal;
QPropertyAnimation *line2Animal;
QPropertyAnimation *line3Animal;
QPropertyAnimation *line4Animal;btform.cppBtForm::BtForm(QWidget *parent): QWidget(parent), ui(new Ui::BtForm)
{ui->setupUi(this);// 设置line1的动画效果line1Animal = new QPropertyAnimation(ui->line1, "geometry", this);line1Animal->setDuration(1500);line1Animal->setKeyValueAt(0, QRect(0, 30, 2, 0));         // 起始位置下移line1Animal->setKeyValueAt(0.5, QRect(0, 15, 2, 15));       // 向上移动一点line1Animal->setKeyValueAt(1, QRect(0, 30, 2, 0));         // 回到起始位置line1Animal->setLoopCount(-1);line1Animal->start();// 设置line2的动画效果line2Animal = new QPropertyAnimation(ui->line2, "geometry", this);line2Animal->setDuration(1600);line2Animal->setKeyValueAt(0, QRect(7, 30, 2, 0));line2Animal->setKeyValueAt(0.5, QRect(7, 15, 2, 15));line2Animal->setKeyValueAt(1, QRect(7, 30, 2, 0));line2Animal->setLoopCount(-1);line2Animal->start();// 设置line3的动画效果line3Animal = new QPropertyAnimation(ui->line3, "geometry", this);line3Animal->setDuration(1700);line3Animal->setKeyValueAt(0, QRect(14, 30, 2, 0));line3Animal->setKeyValueAt(0.5, QRect(14, 15, 2, 15));line3Animal->setKeyValueAt(1, QRect(14, 30, 2, 0));line3Animal->setLoopCount(-1);line3Animal->start();// 设置line4的动画效果line4Animal = new QPropertyAnimation(ui->line4, "geometry", this);line4Animal->setDuration(1800);line4Animal->setKeyValueAt(0, QRect(21, 30, 2, 0));line4Animal->setKeyValueAt(0.5, QRect(21, 15, 2, 15));line4Animal->setKeyValueAt(1, QRect(21, 30, 2, 0));line4Animal->setLoopCount(-1);line4Animal->start();
}

这里QRect函数是:

  • QRect(int x, int y, int width, int height): 创建一个左上角坐标为(x, y),宽度为width,高度为height的矩形。

setKeyValueAt函数是:
        void setKeyValueAt(qreal step, const QVariant &value);
step:值再0~1之间,0表⽰开始,1表⽰停⽌
value:动画的⼀个关键帧,即动画现在的形态,假设是基于geometry,可以设置矩形的范围

经过调整效果如图:

void BtForm::clearBg()
{// 清除上⼀个按钮点击的背景效果,恢复之前的样式ui->btStyle->setStyleSheet("#btStyle:hover{ background:#D8D8D8;} QLabel{background-color : transparent;} #lineBox{background-color : transparent;}");ui->line1->hide();//隐藏动画ui->line2->hide();//隐藏动画ui->line3->hide();//隐藏动画ui->line4->hide();//隐藏动画
}void BtForm::showAnimal()
{ui->line1->show();ui->line2->show();ui->line3->show();ui->line4->show();
}void QQMusic::onBtFormClick(int id)
{// 1.获取当前⻚⾯所有btFrom按钮类型的对象QList<BtForm*> buttonList = this->findChildren<BtForm*>();// 2.遍历所有对象, 如果不是当前id的按钮,则把之前设置的背景颜⾊清除掉foreach (BtForm* btitem, buttonList){if (id != btitem->getId()){btitem->clearBg();}if (btitem->getId()==4){ui->local->showAnimal();//将local面板的linebox动画展示出来}}// 3.设置当前栈空间显⽰⻚⾯ui->stackedWidget->setCurrentIndex(id - 1);
\
}BtForm::BtForm(QWidget *parent): QWidget(parent), ui(new Ui::BtForm)
{ui->setupUi(this);ui->line1->hide();//隐藏动画ui->line2->hide();//隐藏动画ui->line3->hide();//隐藏动画ui->line4->hide();//隐藏动画// 设置line1的动画效果line1Animal = new QPropertyAnimation(ui->line1, "geometry", this);line1Animal->setDuration(1500);line1Animal->setKeyValueAt(0, QRect(0, 30, 2, 0));         // 起始位置下移line1Animal->setKeyValueAt(0.5, QRect(0, 15, 2, 15));       // 向上移动一点line1Animal->setKeyValueAt(1, QRect(0, 30, 2, 0));         // 回到起始位置line1Animal->setLoopCount(-1);line1Animal->start();// 设置line2的动画效果line2Animal = new QPropertyAnimation(ui->line2, "geometry", this);line2Animal->setDuration(1600);line2Animal->setKeyValueAt(0, QRect(7, 30, 2, 0));line2Animal->setKeyValueAt(0.5, QRect(7, 15, 2, 15));line2Animal->setKeyValueAt(1, QRect(7, 30, 2, 0));line2Animal->setLoopCount(-1);line2Animal->start();// 设置line3的动画效果line3Animal = new QPropertyAnimation(ui->line3, "geometry", this);line3Animal->setDuration(1700);line3Animal->setKeyValueAt(0, QRect(14, 30, 2, 0));line3Animal->setKeyValueAt(0.5, QRect(14, 15, 2, 15));line3Animal->setKeyValueAt(1, QRect(14, 30, 2, 0));line3Animal->setLoopCount(-1);line3Animal->start();// 设置line4的动画效果line4Animal = new QPropertyAnimation(ui->line4, "geometry", this);line4Animal->setDuration(1800);line4Animal->setKeyValueAt(0, QRect(21, 30, 2, 0));line4Animal->setKeyValueAt(0.5, QRect(21, 15, 2, 15));line4Animal->setKeyValueAt(1, QRect(21, 30, 2, 0));line4Animal->setLoopCount(-1);line4Animal->start();}

http://www.lryc.cn/news/598406.html

相关文章:

  • 【初识数据结构】CS61B 中的归并排序和选择排序
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • kubernetes集群中部署CoreDNS服务
  • OceanBase 4.3.5 解析:DDL性能诊断
  • 爆肝整理,性能测试详细汇总,从0到1打通(二)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(三)
  • 在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案
  • 深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发
  • 使用宝塔面板搭建 PHP 环境开发一个简单的 PHP 例子
  • 解决VSCode无法加载Json架构问题
  • 《计算机网络》实验报告八 加密、数字签名与证书
  • 力扣844. 比较含退格的字符串
  • 借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
  • 【bug解决】 esp32 在WSL-ubuntu20.04环境下找不到设备
  • MIT线性代数01_方程组的几何解释
  • 造成服务器内存不足的原因有什么
  • 飞腾D2000/E2000/D3000如何从头制作UBOOT引导系统镜像
  • Pycharm、Python安装及配置小白教程
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述
  • 用LangChain重构客服系统:腾讯云向量数据库+GPT-4o实战
  • 使用爬虫获取游戏的iframe地址
  • DRF - 博客列表API
  • Django Models详解:数据库模型的核心
  • Unity3D + VR头显 × RTSP|RTMP播放器:构建沉浸式远程诊疗系统的技术实践
  • Ascendc msOpST测试报错问题
  • 【Unity开发】数据存储——XML
  • MySQL的命令行客户端
  • Code Composer Studio:CCS 设置代码折叠
  • MySQL零基础教程增删改查实战
  • [语言模型训练]基于 PyTorch 的双向 LSTM 文本分类器实现:基于旅店的评论分类语言模型