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.pswp.cn/diannao/92632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92632.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【世紀龍科技】數字課程資源-新能源汽車概論

一、課程介紹本課程為通過項目任務式教學&#xff0c;全面系統的講解了新能源汽車的基礎知識及相關技能&#xff0c;培養和提高學生的動手能力和理論知識的工程應用能力。以典型工作任務帶動知識與技能的學習&#xff0c;采用項目教學培養學生的崗位技能、學習能力和職業素養。…

iOS Core Data 本地數據庫 使用詳解:從模型關系到數據操作

一、引言&#xff1a;Core Data&#xff0c;在本地數據持久化中的地位在 iOS 開發中&#xff0c;本地數據存儲幾乎是每一個 App 都繞不開的問題。無論是緩存用戶信息、離線瀏覽內容&#xff0c;還是記錄用戶操作歷史&#xff0c;一個合適的數據持久化方案都能大大提升應用的體驗…

Java-79 深入淺出 RPC Dubbo 動態路由架構詳解:從規則設計到上線系統集成

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-30-新發布【1T 萬億】參數量大模型&#xff01;Kim…

Linux內核中動態內存分配函數解析

在C語言中&#xff0c;動態內存分配通常用于在運行時申請內存。在內核編程中&#xff0c;動態內存分配與用戶空間有所不同&#xff0c;因為內核需要更謹慎地處理內存&#xff0c;且不能使用用戶空間的庫&#xff08;如glibc&#xff09;。下面我們將詳細分析Linux內核中動態申請…

Next.js 中配置不同頁面布局方案

在 Next.js 應用中&#xff0c;你可以通過多種方式實現某些頁面全屏、某些頁面帶菜單/頁眉/頁腳的需求。以下是幾種實現方案&#xff1a; 方案一&#xff1a;使用多個布局組件 1. 創建不同的布局組件 // app/default-layout.tsx import Header from /components/header; import…

Spring Boot 使用外置 Servlet 容器:從配置到部署全指南

在 Spring Boot 開發中&#xff0c;我們通常使用嵌入式 Servlet 容器&#xff08;如 Tomcat&#xff09;&#xff0c;它能將應用打包成可執行 JAR&#xff0c;簡化部署流程。但在某些場景下&#xff08;如需要支持 JSP、復雜的容器定制或企業級部署規范&#xff09;&#xff0c…

借助AI學習開源代碼git0.7之九diff-files

借助AI學習開源代碼git0.7之九diff-files diff-files.c 是一個用于比較工作目錄中的文件和 Git 索引&#xff08;暫存區&#xff09;中文件的工具。 實質上&#xff0c;它是 git diff命令在不指定特定提交時功能的核心實現。 主要功能分析&#xff1a; 1. 核心功能 diff-files …

社區資源媒體管理系統設計與實現

社區資源媒體管理系統設計與實現 1. 系統概述 社區資源媒體管理系統是一個專為社區戶外廣告打造的高效、專業化平臺&#xff0c;旨在實現社區媒體的數字化管理、智能投放和便捷交易。該系統將整合社區各類廣告資源&#xff0c;為廣告主、物業公司和社區居民提供一站式服務。 1.…

12.1.6 weak_ptr

weak_ptr weak_ptr會指向一個share_ptr&#xff08;使用一個share_ptr來初始化weak_ptr&#xff09;&#xff0c;但并不會增加這個share_ptr的引用計數器&#xff0c;其析構也不會減少share_ptr的引用計數器。 構造函數及使用 #include <iostream> #include <memory&g…

深度分析Java內存模型

Java 內存模型&#xff08;Java Memory Model, JMM&#xff09;是 Java 并發編程的核心基石&#xff0c;它定義了多線程環境下線程如何與主內存&#xff08;Main Memory&#xff09;以及線程的本地內存&#xff08;工作內存&#xff0c;Working Memory&#xff09;交互的規則。…

代碼隨想錄算法訓練營第五十二天|圖論part3

101. 孤島的總面積 題目鏈接&#xff1a;101. 孤島的總面積 文章講解&#xff1a;代碼隨想錄 思路&#xff1a; 與島嶼面積差不多&#xff0c;區別是再dfs的時候&#xff0c;如果碰到越界的&#xff0c;需要用一個符號標記這不是孤島再continue #include <iostream> #i…

前端實現 excel 數據導出,封裝方法支持一次導出多個Sheet

一、前言 后臺管理項目有時會有需要前端導出excel表格的功能&#xff0c;有時還需要導出多個sheet&#xff0c;并給每個sheet重新命名&#xff0c;下面我們就來實現一下。 二、實現效果圖 三、實現步驟 1、 安裝 命令行安裝 xlsx 和 file-saver npm install xlsx -S npm i…

【Lambda 表達式】返回值為什么是auto

一個例子&#xff1a; int x 10; auto add_x [x](int y) -> int {return x y; }; int result add_x(5); // 結果是 15lambda 是匿名類型&#xff0c;必須用 auto 來接收。&#xff08;必須寫auto&#xff0c;不可省略&#xff09;內層 -> auto 是函數的返回類型自動推…

【小董談前端】【樣式】 CSS與樣式庫:從實現工具到設計思維的跨越

CSS與樣式庫&#xff1a;從實現工具到設計思維的跨越 一、CSS的本質&#xff1a;樣式實現的「施工隊」 CSS作為網頁樣式的描述語言&#xff0c;其核心能力在于&#xff1a; 精確控制元素的尺寸、位置、顏色實現響應式布局和動畫效果與HTML/JavaScript協同完成交互體驗 但CS…

MTSC2025參會感悟:大模型 + CV 重構全終端 UI 檢測技術體系

目錄 一、傳統 UI 自動化的困局:高成本與低效率的雙重枷鎖 1.1 根深蒂固的技術痛點 1.2 多維度質量挑戰的疊加 二、Page eyes 1.0:純視覺方案破解 UI 檢測困局 2.1 純視覺檢測的核心理念 2.2 頁面加載完成的智能判斷 2.3 視覺模型驅動的異常檢測 2.4 大模型賦能未知異…

使用Claude Code從零到一打造一個現代化的GitHub Star項目管理器

在日常的開發工作中&#xff0c;我們經常會在GitHub上star一些有用的項目庫。隨著時間的推移&#xff0c;star的項目越來越多&#xff0c;如何有效管理這些項目成為了一個痛點。 今天&#xff0c;分享我使用Claude Code從零構建的一個GitHub Star管理插件。項目背景與需求分析 …

為什么 Linux 啟動后還能升級內核?

? 為什么 Linux 啟動后還能升級內核&#xff1f; 簡單結論&#xff1a; 因為 “安裝/升級內核 ≠ 當前就使用該內核”&#xff0c;Linux允許你安裝多個內核版本&#xff0c;并在下次啟動時選擇其中一個來加載運行。 &#x1f9e0; 舉個現實生活類比 你在穿一件衣服&#xff08…

Go語言實戰案例-統計文件中每個字母出現頻率

以下是《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例19&#xff1a;統計文件中每個字母出現頻率 的完整內容。本案例適合用來練習文件讀取、字符處理、map統計等基礎技能。&#x1f3af; 案例目標讀取一個本地文本文件&#xff0c;統計并打印出其中每個英文字母&#xff…

Notepad++工具操作技巧

1、notepad -> ctrlf -> 替換(正則表達式) -> $-a ->每行的行尾加a&#xff1b; 2、notepad -> ctrlf -> 替換(正則表達式) -> ^-a ->每行的行首加a &#xff1b; 3、按住alt切換為列模式 4、刪除空行-不包括有空格符號的空行 查找替代 查找目標…

領碼課堂 | Java與AI的“硬核“交響曲:當企業級工程思維遇上智能時代

摘要 &#x1f680; 在AI工業化落地的深水區&#xff0c;Java正以其獨特的工程化優勢成為中流砥柱。本文系統解構Java在AI項目全生命周期中的技術矩陣&#xff0c;通過"三階性能優化模型"、"微服務化AI部署架構"等原創方法論&#xff0c;結合大模型部署、M…