{"id":34388,"date":"2025-04-29T10:38:29","date_gmt":"2025-04-29T02:38:29","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/34388.html"},"modified":"2025-04-29T10:38:29","modified_gmt":"2025-04-29T02:38:29","slug":"%e5%9f%ba%e4%ba%8eqt%e7%9a%84%e4%bb%bfqq%e9%9f%b3%e4%b9%90%e6%92%ad%e6%94%be%e5%99%a8","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/34388.html","title":{"rendered":"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668"},"content":{"rendered":"<h2>\u4e00\u3001\u9879\u76ee\u4ecb\u7ecd\u00a0<\/h2>\n<p> <span style=\"color:#1f2329\">\u8be5\u9879\u76ee\u662f\u57fa\u4e8eQT\u5f00\u53d1\u7684\u2fb3\u4e50\u64ad\u653e\u8f6f\u4ef6&#xff0c;\u754c\u9762\u53cb\u597d&#xff0c;\u529f\u80fd\u4e30\u5bcc&#xff0c;\u4e3b\u8981\u529f\u80fd\u5982\u4e0b&#xff1a;<\/span> <\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"245\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023822-68103b9ec6784.png\" width=\"380\" \/><\/p>\n<p>\u7a97\u53e3hand\u90e8\u5206&#xff1a;<\/p>\n<p>   <span style=\"color:#1f2329\">\u70b9\u51fb\u6700\u5c0f\u5316\u6309\u94ae&#xff0c;\u7a97\u53e3\u6700\u5c0f\u5316 <\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u70b9\u51fb\u6700\u5927\u5316\u6309\u94ae&#xff0c;\u7a97\u53e3\u6700\u5927\u5316<\/span> <\/p>\n<p>    \u70b9\u51fb\u5173\u95ed\u6309\u94ae&#xff0c;\u7a0b\u5e8f\u9000\u51fa <\/p>\n<p>\u7a97\u53e3body\u5de6\u4fa7\u90e8\u5206&#xff1a;<\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u63a8\u8350\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u63a8\u8350Page(\u6682\u65f6\u53ea\u6709\u9875\u9762&#xff09;<\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u7535\u53f0\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u7535\u53f0Page(\u672a\u2f40\u6301) <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u97f3\u4e50\u9986\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u97f3\u4e50\u9986Page(\u672a\u2f40\u6301) <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u6211\u559c\u6b22\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u6536\u85cf\u7684\u97f3\u4e50Page <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u672c\u5730\u4e0b\u8f7d\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u672c\u5730\u97f3\u4e50Page <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u6700\u8fd1\u64ad\u653e\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u6700\u8fd1\u64ad\u653ePage<\/span> <\/p>\n<p>\u00a0\u7a97\u53e3body\u53f3\u4fa7\u90e8\u5206<\/p>\n<p>  <span style=\"color:#1f2329\">\u5f53\u7a97\u53e3\u5de6\u4fa7\u4e0d\u540c\u6309\u94ae\u70b9\u51fb&#xff0c;\u5728\u7a97\u53e3\u53f3\u4fa7\u4f1a\u5c55\u793a\u4e0d\u540c\u7684\u9875\u9762&#xff0c;\u672c\u9879\u76ee\u6682\u53ea\u652f\u6301\u4e86\u672c\u5730\u97f3\u4e50\u3001\u559c\u6b22\u97f3\u4e50\u3001\u6700\u8fd1\u64ad\u653e\u97f3\u4e50\u7684\u5c55\u793a\u3002\u5177\u4f53\u529f\u80fd\u5982\u4e0b&#xff1a; <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u5168\u90e8\u64ad\u653e\u6309\u94ae&#xff0c;\u64ad\u653e\u5f53\u524d\u9875\u9762\u5217\u8868\u4e2d\u6240\u6709\u97f3\u4e50 <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u53cc\u51fb\u5217\u8868\u4e2d\u67d0\u2fb3\u4e50&#xff0c;\u64ad\u653e\u5f53\u524d\u9009\u4e2d\u97f3\u4e50 <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u70b9\u51fb\u5fc3\u652f\u6301\u6536\u85cf <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u652f\u6301\u6700\u8fd1\u64ad\u653e\u8fc7\u97f3\u4e50\u8bb0\u5fc6<\/span> <\/p>\n<p><span style=\"color:#1f2329\">\u70b9\u51fb\u63a8\u8350\u6309\u94ae&#xff0c;\u7a97\u53e3\u53f3\u4fa7\u663e\u793a&#xff1a;\u63a8\u8350Page(\u6682\u53ea\u6709\u9875\u9762)<\/span>\u00a0<\/p>\n<p>\u64ad\u653e\u63a7\u5236\u533a\u57df<\/p>\n<p>  <span style=\"color:#1f2329\">\u652f\u6301seek\u529f\u80fd&#xff0c;\u5373\u62d6\u62fd\u5230\u6b4c\u66f2\u6307\u5b9a\u4f4d\u7f6e\u64ad\u653e <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u652f\u6301&#xff1a;\u968f\u673a\u3001\u5355\u66f2\u5faa\u73af\u3001\u5faa\u73af\u64ad\u653e <\/span> <\/p>\n<p>  <span style=\"color:#1f2329\">\u652f\u6301\u64ad\u653e\u4e0a\u2f00\u66f2<\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u652f\u6301\u64ad\u653e\u4e0b\u2f00\u66f2 <\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u652f\u6301\u64ad\u653e\u548c\u6682\u505c <\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u652f\u97f3\u91cf\u8c03\u8282\u548c\u9759\u97f3<\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u652f\u6301\u6b4c\u66f2\u603b\u65f6\u957f\u663e\u793a\u3001\u5f53\u524d\u64ad\u653e\u65f6\u95f4\u663e\u793a<\/span> <\/p>\n<p>   <span style=\"color:#1f2329\">\u652f\u6301LRC\u6b4c\u8bcd\u540c\u6b65\u663e\u793a<\/span> <\/p>\n<h2>\u4e8c\u3001\u754c\u9762\u5f00\u53d1<\/h2>\n<p>\u754c\u9762\u5927\u4f53\u4e0a\u5206\u4e3ahead\u548cbody\u4e24\u90e8\u5206<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"303\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023823-68103b9f1cdf1.png\" width=\"364\" \/><\/p>\n<h3>1\u3001head\u90e8\u5206\u5206\u6790<\/h3>\n<p>\u4ece\u5de6\u5230\u53f3\u4f9d\u6b64\u4e3a\u56fe\u6807\u3001\u641c\u7d22\u6846\u3001\u66f4\u6362\u76ae\u80a4\u6309\u94ae\u3001\u6700\u5c0f\u5316\u6309\u94ae\u3001\u6700\u5927\u5316\u6309\u94ae\u3001\u5173\u95ed\u6309\u94ae<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"129\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023823-68103b9f7b944.png\" width=\"1009\" \/><\/p>\n<h3>2\u3001body\u90e8\u5206\u5206\u6790<\/h3>\n<p> <span style=\"color:#1f2329\">body\u533a\u57df\u5206\u4e3a\u5de6\u4fa7\u79cd\u7c7b\u9009\u62e9\u533a\u57df\u548c\u53f3\u4fa7Page\u5c55\u793a\u533a\u3002<\/span> <\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"253\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023823-68103b9fa9882.png\" width=\"334\" \/><\/p>\n<p>  <span style=\"color:#1f2329\">Body\u5de6\u4fa7\u533a\u57df\u7531\u4e24\u90e8\u5206\u7ec4\u6210&#xff1a;\u5728\u7ebf\u97f3\u4e50 \u548c \u6211\u7684\u97f3\u4e50&#xff0c;\u4e24\u90e8\u5206\u5185\u90e8\u7684\u63a7\u4ef6\u79cd\u7c7b\u662f\u76f8\u540c\u7684\u3002<\/span> <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"306\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023824-68103ba00f279.png\" width=\"705\" \/>Body\u53f3\u4fa7\u90e8\u5206\u7531\u00a0page\u533a\u3001\u64ad\u653e\u8fdb\u5ea6\u3001\u64ad\u653e\u63a7\u5236\u533a\u4e09\u4e2a\u90e8\u5206\u7ec4\u6210<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"228\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023824-68103ba03d19f.png\" width=\"313\" \/><\/p>\n<p>\u2460page\u533a\u57df&#xff1a;\u6b4c\u66f2\u4fe1\u606f\u9875\u9762&#xff0c;\u70b9\u51fb \u201c&lt;\u201d \u6216 \u201c&gt;\u201d\u5177\u6709\u8f6e\u756a\u64ad\u56fe\u6548\u679c<\/p>\n<p>\u2461\u64ad\u653e\u8fdb\u5ea6&#xff1a;\u5f53\u524d\u6b4c\u66f2\u64ad\u653e\u8fdb\u5ea6\u8bf4\u660e&#xff0c;\u652f\u6301seek\u529f\u80fd&#xff0c;\u4e0e\u64ad\u653e\u63a7\u5236\u533a\u65f6\u95f4\u3001\u4ee5\u53caLRC\u6b4c\u8bcd\u662f\u540c\u6b65\u7684<\/p>\n<p>\u2462\u64ad\u653e\u63a7\u5236\u533a\u57df&#xff1a;\u663e\u793a\u6b4c\u66f2\u56fe\u7247&amp;\u540d\u79f0&amp;\u6b4c\u624b\u64ad\u653e\u6a21\u5f0f&amp;\u4e0b\u4e00\u66f2&amp;\u64ad\u653e\u6682\u505c&amp;\u4e0a\u4e00\u66f2&amp;\u97f3\u91cf\u8c03\u8282\u548c\u9759\u97f3&amp;\u6dfb\u52a0\u672c\u5730\u97f3\u4e50\u5f53\u524d\u64ad\u653e\u65f6\u95f4\/\u6b4c\u66f2\u603b\u65f6\u957f&amp;\u5f39\u51fa\u6b4c\u8bcd\u7a97\u53e3\u6309\u94ae<\/p>\n<p>\u5f53\u70b9\u51fb\u65f6\u7684page\u9875\u9762&#xff1a;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"720\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023824-68103ba09433e.png\" width=\"1561\" \/><\/p>\n<p>\u6240\u4ee5\u6211\u559c\u6b22\u3001\u672c\u5730\u97f3\u4e50\u3001\u6700\u8fd1\u64ad\u653e\u5171\u7528\u4e00\u4e2acommonPage\u9875\u9762&#xff0c;<\/p>\n<p>\u63a8\u8350\u9875\u9762\u9700\u8981\u652f\u6301\u70b9\u51fb\u6309\u94ae\u65f6\u7684\u8f6e\u756a\u5c55\u793a\u6821\u6548\u679c&#xff0c;\u6240\u4ee5\u5355\u72ec\u7528\u4e00\u4e2a\u9875\u9762<\/p>\n<p>\u00a0\u6b4c\u8bcd\u5c55\u793a<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"323\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023825-68103ba1321e1.png\" width=\"492\" \/><\/p>\n<p>\u663e\u793a\u5185\u5bb9\u5206\u4e3a&#xff1a;\u6b4c\u66f2\u4fe1\u606f\u3001\u6b4c\u8bcd\u90e8\u5206\u3001\u5de6\u4e0a\u65b9\u6536\u8d77\u9690\u85cf\u6309\u94ae\u3002 \u6b4c\u66f2\u4fe1\u606f\u7531\u6b4c\u66f2\u540d\u79f0(QLabel)\u548c\u6b4c\u624b\u540d\u79f0(QLabel)\u6784\u6210 \u6b4c\u8bcd\u90e8\u5206\u5c55\u793a\u5f53\u524d\u5728\u5531\u6b4c\u8bcd(QLabel)\u548c\u5728\u5531\u90e8\u5206\u524d\u4e09\u884c\u548c\u540e\u4e09\u884c\u6b4c\u8bcd(QLabel)\u5c55\u793a&#xff0c;\u5f53\u524d\u64ad\u653e\u6b4c\u8bcd\u7a81\u51fa\u663e\u793a \u70b9\u51fb\u6536\u8d77\u6309\u94ae\u540e&#xff0c;\u8be5\u9875\u9762\u4f1a\u4ee5\u52a8\u753b\u7684\u65b9\u5f0f\u6536\u8d77 \u5f53\u6b4c\u66f2\u6709LRC\u6b4c\u8bcd\u65f6&#xff0c;\u64ad\u653e\u65f6\u6b4c\u8bcd\u4f1a\u968f\u64ad\u653e\u65f6\u95f4\u81ea\u52a8\u8c03\u6574&#xff1b;\u6b4c\u66f2\u6ca1\u6709LRC\u6b4c\u8bcd\u65f6&#xff0c;\u6b4c\u8bcd\u90e8\u5206\u663e\u793a\u7a7a\u5b57\u7b26\u3002<\/p>\n<p>\u6b4c\u66f2\u63a7\u5236\u533a<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"112\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023825-68103ba1ea453.png\" width=\"1075\" \/><\/p>\n<p>\u4ece\u5de6\u81f3\u53f3\u4f9d\u6b21\u4e3a<\/p>\n<p>1\u3001\u6b4c\u66f2\u5c01\u9762\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 2\u3001\u6b4c\u66f2\u4fe1\u606f\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 3\u3001\u5207\u6362\u64ad\u653e\u6a21\u5f0f\u00a0<\/p>\n<p>4\u3001\u4e0a\u4e00\u66f2\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a05\u3001\u64ad\u653e\/\u6682\u505c\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 6\u3001\u4e0b\u4e00\u66f2<\/p>\n<p>7\u3001\u8c03\u8282\u58f0\u97f3\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a08\u3001\u6dfb\u52a0\u672c\u5730\u97f3\u4e50\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 9\u3001\u603b\u65f6\u95f4\u4e0e\u5f53\u524d\u64ad\u653e\u65f6\u95f4<\/p>\n<p>10\u3001\u663e\u793a\u6b4c\u8bcd<\/p>\n<h2>\u00a0QQMusic\u7c7b<\/h2>\n<p>\u521b\u5efa\u4e00\u4e2aAPPlication&#xff0c;\u5c06ui\u754c\u9762\u7684\u5e03\u5c40\u5b8c\u6210\u540e\u5bf9\u5176\u8fdb\u884c\u754c\u9762\u7f8e\u5316.<\/p>\n<h3>1\u3001widget\u7a97\u53e3\u65e0\u6807\u9898<\/h3>\n<p>\u5c06\u521d\u59cb\u5316\u754c\u9762\u7684\u5de5\u4f5c\u653e\u5728void initui()\u91cc\u9762,\u5728\u91cc\u9762\u6dfb\u52a0<\/p>\n<p>\/\/ \u8bbe\u7f6e\u2f46\u8fb9\u6846\u7a97\u2f1d&#xff0c;\u5373\u7a97\u2f1d\u5c06\u6765\u2f46\u6807\u9898\u680f<br \/>\n setWindowFlag(Qt::WindowType::FramelessWindowHint); <\/p>\n<h3>2\u3001\u5b9e\u73b0\u9f20\u6807\u62d6\u52a8\u7a97\u53e3<\/h3>\n<p>\u91cd\u5199QQmusic\u7236\u7c7b\u4e2d\u7684mousepressEvent\u548cmousemoveEventvent\u4e8b\u4ef6&#xff1b;<\/p>\n<p>\u9f20\u6807\u5de6\u952e\u6309\u4e0b\u65f6&#xff0c;\u8bb0\u5f55\u4e0b\u7a97\u53e3\u5de6\u4e0a\u89d2\u548c\u9f20\u6807\u7684\u76f8\u5bf9\u4f4d\u7f6e&#xff1b; \u9f20\u6807\u79fb\u52a8\u65f6&#xff0c;\u4f1a\u4ea7\u751f\u65b0\u7684\u4f4d\u7f6e&#xff0c;\u4fdd\u6301\u9f20\u6807\u548c\u7a97\u53e3\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4f4d\u7f6e\u4e0d\u53d8&#xff0c;\u901a\u8fc7move\u4fee\u6539\u7a97\u53e3\u7684\u5de6\u4e0a\u89d2\u5750\u6807\u5373\u53ef\u3002<\/p>\n<p>void QQMusic::mousePressEvent(QMouseEvent* event)<br \/>\n{<br \/>\n    \/\/ \u62e6\u622a\u2fcf\u6807\u5de6\u952e\u5355\u51fb\u4e8b\u4ef6<br \/>\n    if (event-&gt;button() &#061;&#061; Qt::LeftButton)<br \/>\n    {<br \/>\n        \/\/ event-&gt;globalPos()&#xff1a;\u2fcf\u6807\u6309\u4e0b\u4e8b\u4ef6\u53d1\u2f63\u65f6&#xff0c;\u5149\u6807\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u2ec6\u4f4d\u7f6e<br \/>\n        \/\/ frameGeometry().topLeft(): \u2fcf\u6807\u6309\u4e0b\u4e8b\u4ef6\u53d1\u2f63\u65f6&#xff0c;\u7a97\u2f1d\u5de6\u4e0a\u2ec6\u4f4d\u7f6e<br \/>\n        \/\/ geometry(): \u4e0d\u5305\u62ec\u8fb9\u6846\u53ca\u9876\u90e8\u6807\u9898\u533a\u7684\u8303\u56f4<br \/>\n        \/\/ frameGeometry(): \u5305\u62ec\u8fb9\u6846\u53ca\u9876\u90e8\u6807\u9898\u533a\u7684\u8303\u56f4<br \/>\n        \/\/ event-&gt;globalPos() &#8211; frameGeometry().topLeft() \u5373\u4e3a&#xff1a;<br \/>\n        \/\/ \u2fcf\u6807\u6309\u4e0b\u65f6&#xff0c;\u7a97\u2f1d\u5de6\u4e0a\u2ec6\u548c\u5149\u6807\u4e4b\u95f4\u7684\u8ddd\u79bb\u5dee<br \/>\n        \/\/ \u60f3\u8981\u7a97\u2f1d\u2fcf\u6807\u6309\u4e0b\u65f6\u7a97\u2f1d\u79fb\u52a8&#xff0c;\u53ea\u9700\u8981\u5728mouseMoveEvent\u4e2d&#xff0c;\u8ba9\u5149\u6807\u548c\u7a97\u2f1d\u5de6\u4e0a\u2ec6\u4fdd\u6301\u76f8\u540c\u7684\u4f4d\u7f6e\u5dee<br \/>\n        \/\/ \u83b7\u53d6\u2fcf\u6807\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u2ec6\u7684\u5168\u5c40\u5750\u6807<br \/>\n        dragPosition &#061; event-&gt;globalPos() &#8211; frameGeometry().topLeft();<br \/>\n        return;<br \/>\n    }<br \/>\n    QWidget::mousePressEvent(event);<br \/>\n}<br \/>\nvoid QQMusic::mouseMoveEvent(QMouseEvent* event)<br \/>\n{<br \/>\n    if (event-&gt;buttons() &#061;&#061; Qt::LeftButton)<br \/>\n    {<br \/>\n        \/\/ \u6839\u636e\u2fcf\u6807\u79fb\u52a8\u66f4\u65b0\u7a97\u2f1d\u4f4d\u7f6e<br \/>\n        move(event-&gt;globalPos() &#8211; dragPosition);<br \/>\n        return;<br \/>\n    }<br \/>\n    QWidget::mouseMoveEvent(event);<br \/>\n} <\/p>\n<h3>3\u3001<span style=\"color:#1f2329\">\u7ed9\u7a97\u53e3\u6dfb\u52a0\u9634\u5f71<\/span><\/h3>\n<p> <span style=\"color:#1f2329\">\u5728 <\/span><br \/>\n <span style=\"color:#000000\">initUI() <\/span><br \/>\n <span style=\"color:#1f2329\">\u51fd\u6570\u4e2d\u6dfb\u52a0&#xff1a;<\/span> <\/p>\n<p> \/\/ \u8bbe\u7f6e\u7a97\u2f1d\u80cc\u666f\u900f\u660e<br \/>\nthis-&gt;setAttribute(Qt::WA_TranslucentBackground);<\/p>\n<p>\/\/ \u7ed9\u7a97\u2f1d\u8bbe\u7f6e\u9634\u5f71\u6548\u679c<br \/>\nQGraphicsDropShadowEffect* shadowEffect &#061; new QGraphicsDropShadowEffect(this);<br \/>\nshadowEffect-&gt;setOffset(0, 0); \/\/ \u8bbe\u7f6e\u9634\u5f71\u504f\u79fb<br \/>\nshadowEffect-&gt;setColor(&#034;#000000&#034;); \/\/ \u8bbe\u7f6e\u9634\u5f71\u989c\u2f8a&#xff1a;\u2fca\u2f8a<br \/>\nshadowEffect-&gt;setBlurRadius(10); \/\/ \u8bbe\u7f6e\u9634\u5f71\u7684\u6a21\u7cca\u534a\u5f84<br \/>\nthis-&gt;setGraphicsEffect(shadowEffect); <\/p>\n<h2>BtForm\u7c7b<\/h2>\n<p>\u6dfb\u52a0\u4e00\u4e2a\u65b0\u8bbe\u8ba1\u5e08\u754c\u9762&#xff0c;\u547d\u540d\u4e3aBtForm<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"228\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023826-68103ba229703.png\" width=\"465\" \/><\/p>\n<\/p>\n<p>\u00a0<img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"336\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023826-68103ba28d1c6.png\" width=\"496\" \/><\/p>\n<p>\u5c06bfForm\u7684ui\u754c\u9762\u8bbe\u8ba1\u597d\u540e&#xff0c;\u5c06QQmusic\u7684ui\u754c\u9762\u7684\u76f8\u5173<span style=\"color:#1f2329\">\u7684QWidget\u5168\u90e8\u63d0\u5347\u4e3aBtForm\u3002<\/span><\/p>\n<p><span style=\"color:#1f2329\">\u6548\u679c\u56fe&#xff1a;<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"138\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023826-68103ba2bc0ca.png\" width=\"71\" \/><\/p>\n<h3>1\u3001<span style=\"color:#1f2329\">\u8bbe\u7f6e\u6309\u94ae\u4e0a\u7684\u56fe\u7247\u548c\u6587\u5b57\u4fe1\u606f&#xff0c;\u4ee5\u53ca\u8be5\u6309\u94ae\u5173\u8054\u7684page\u9875\u9762<\/span><\/h3>\n<p>void btFrom::seticon(QString btIcon, QString btText, int mid)<br \/>\n{<br \/>\n    \/\/ \u8bbe\u7f6e\u2f83\u5b9a\u4e49\u6309\u94ae\u7684\u56fe\u2f5a\u3001\u2f42\u5b57\u3001\u4ee5\u53caid<br \/>\n    ui-&gt;btIcon-&gt;setPixmap(QPixmap(btIcon));<br \/>\n    ui-&gt;btText-&gt;setText(btText);<br \/>\n    this-&gt;id &#061; mid;<br \/>\n} <\/p>\n<p> <span style=\"color:#1f2329\">\u5728QQMusic.cpp\u7684initUI()\u51fd\u6570\u4e2d\u65b0\u589e&#xff1a;<\/span> <\/p>\n<p> \/\/ \u8bbe\u7f6eBodyLeft\u4e2d6\u4e2abtForm\u7684\u4fe1\u606f<br \/>\n ui-&gt;rec-&gt;seticon(&#034;:\/images\/rec.png&#034;, &#034;\u63a8\u8350&#034;, 1);<br \/>\n ui-&gt;music-&gt;seticon(&#034;:\/images\/music.png&#034;, &#034;\u2fb3\u4e50\u9986&#034;, 2);<br \/>\n ui-&gt;audio-&gt;seticon(&#034;:\/images\/radio.png&#034;, &#034;\u7535\u53f0&#034;, 3);<br \/>\n ui-&gt;like-&gt;seticon(&#034;:\/images\/like.png&#034;, &#034;\u6211\u559c\u6b22&#034;, 4);<br \/>\n ui-&gt;local-&gt;seticon(&#034;:\/images\/local.png&#034;, &#034;\u672c\u5730\u4e0b\u8f7d&#034;, 5);<br \/>\n ui-&gt;recent-&gt;seticon(&#034;:\/images\/recent.png&#034;, &#034;\u6700\u8fd1\u64ad\u653e&#034;, 6); <\/p>\n<h3>2\u3001\u6309\u4e0bbtForm\u952e\u540e\u7684\u54cd\u5e94&#xff08;\u91cd\u5199\u5176\u7236\u7c7b\u7684mousePressEvent&#xff09;<\/h3>\n<p>\u5f53\u6309\u94ae\u6309\u4e0b\u65f6&#xff1a;\u2460\u6309\u94ae\u989c\u8272\u53d1\u751f\u53d8\u5316 \u2461\u7ed9QQMusic\u7c7b\u53d1\u9001click\u4fe1\u53f7<\/p>\n<p> void btFrom::mousePressEvent(QMouseEvent* event)<br \/>\n{<br \/>\n    \/\/ \u544a\u8bc9\u7f16\u8bd1\u5668\u4e0d\u8981\u89e6\u53d1\u8b66\u544a<br \/>\n    (void)event;<br \/>\n    \/\/ \u2fcf\u6807\u70b9\u51fb\u4e4b\u540e&#xff0c;\u80cc\u666f\u53d8\u4e3a\u7eff\u2f8a&#xff0c;\u2f42\u5b57\u53d8\u4e3a\u2f69\u2f8a<br \/>\n    ui-&gt;btStyle-&gt;setStyleSheet(&#034;#btStyle{ background:rgb(30,206,154);} *{color:#F6F6F6; }&#034;);<br \/>\n    emit click(this-&gt;id); \/\/ \u53d1\u9001\u2fcf\u6807\u70b9\u51fb\u4fe1\u53f7<br \/>\n} <\/p>\n<p>\u2462QQMusic\u7c7b\u5904\u7406\u8be5\u4fe1\u53f7&#xff0c;\u5185\u90e8&#xff1a;\u5b9e\u73b0\u7a97\u53e3\u5207\u6362&#xff0c;\u5e76\u6e05\u9664\u4e0a\u6b21\u6309\u94ae\u70b9\u51fb\u7559\u4e0b\u7684\u6837\u5f0f&#xff0c;\u56e0\u6b64QQMuisc\u4e2d\u9700\u8981\u65b0\u589e&#xff1a;<\/p>\n<p> \/\/ qqmusic.cpp \u65b0\u589e<br \/>\nvoid QQMusic::connectSignalAndSlot()<br \/>\n{<br \/>\n \/\/ &#8230;<br \/>\n \/\/ \u2f83\u5b9a\u4e49\u7684btFrom\u6309\u94ae\u70b9\u51fb\u4fe1\u53f7&#xff0c;\u5f53btForm\u70b9\u51fb\u540e&#xff0c;\u8bbe\u7f6e\u5bf9\u5e94\u7684\u5806\u53e0\u7a97\u2f1d<br \/>\n connect(ui-&gt;rec, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n connect(ui-&gt;musics, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n connect(ui-&gt;audio, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n connect(ui-&gt;like, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n connect(ui-&gt;local, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n connect(ui-&gt;recent, &amp;btFrom::click, this, &amp;QQMusic::onBtFormClick);<br \/>\n}<\/p>\n<p>void Widget::onBtFormClick(int id)<br \/>\n{<br \/>\n    \/\/ 1.\u83b7\u53d6\u5f53\u524d\u2eda\u2faf\u6240\u6709btFrom\u6309\u94ae\u7c7b\u578b\u7684\u5bf9\u8c61<br \/>\n    QList&lt;BtForm*&gt; buttonList &#061; this-&gt;findChildren&lt;BtForm*&gt;();<br \/>\n    \/\/ 2.\u904d\u5386\u6240\u6709\u5bf9\u8c61, \u5982\u679c\u4e0d\u662f\u5f53\u524did\u7684\u6309\u94ae,\u5219\u628a\u4e4b\u524d\u8bbe\u7f6e\u7684\u80cc\u666f\u989c\u2f8a\u6e05\u9664\u6389<br \/>\n    foreach(BtForm * btitem, buttonList)<br \/>\n    {<br \/>\n        if (id !&#061; btitem-&gt;getId())<br \/>\n        {<br \/>\n            btitem-&gt;clearBg();<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ 3.\u8bbe\u7f6e\u5f53\u524d\u6808\u7a7a\u95f4\u663e\u2f70\u2eda\u2faf<br \/>\n    ui-&gt;stackedWidget-&gt;setCurrentIndex(id &#8211; 1);<br \/>\n} <\/p>\n<p>bfFom\u7c7b\u4e2d\u6dfb\u52a0&#xff1a;<\/p>\n<p> \/\/ btform.cpp \u65b0\u589e&#xff1a;<br \/>\nvoid BtForm::clearBg()<br \/>\n{<br \/>\n    \/\/ \u6e05\u9664\u4e0a\u2f00\u4e2a\u6309\u94ae\u70b9\u51fb\u7684\u80cc\u666f\u6548\u679c,\u6062\u590d\u4e4b\u524d\u7684\u6837\u5f0f<br \/>\n    ui-&gt;btStyle-&gt;setStyleSheet(&#034;#btStyle:hover{ background:#D8D8D8;} &#034;);<br \/>\n}<br \/>\nint BtForm::getId()<br \/>\n{<br \/>\n    return id;<br \/>\n} <\/p>\n<h3>3\u3001btForm\u7c7b\u4e2d\u7684\u52a8\u753b\u6548\u679c<\/h3>\n<p>\u5373\u7ed9bfForm\u7c7b\u4e2d\u76844\u4e2aQLabel\u8bbe\u7f6e\u52a8\u753b\u6548\u679c&#xff0c;\u5728btFrom\u7c7b\u4e2d\u7684\u6784\u9020\u51fd\u6570\u4e2d\u65b0\u589e&#xff0c;\u91cc\u9762\u7684QRect\u7c7b\u7684\u53c2\u6570\u6839\u636e\u81ea\u5df1\u8bbe\u7f6e\u7684ui\u754c\u9762\u7684\u6807\u51c6\u6765\u786e\u5b9a<\/p>\n<p> \/\/ \u8bbe\u7f6eline1\u7684\u52a8\u753b\u6548\u679c<br \/>\nline1Animal &#061; new QPropertyAnimation(ui-&gt;line1, &#034;geometry&#034;, this);<br \/>\nline1Animal-&gt;setDuration(1500);                      \/\/\u6301\u7eed\u65f6\u95f4<br \/>\nline1Animal-&gt;setKeyValueAt(0, QRect(0, 15, 2, 0));   \/\/\u5173\u952e\u5e27<br \/>\nline1Animal-&gt;setKeyValueAt(0.5, QRect(0, 0, 2, 15));<br \/>\nline1Animal-&gt;setKeyValueAt(1, QRect(0, 15, 2, 0));<br \/>\nline1Animal-&gt;setLoopCount(-1);                       \/\/\u5faa\u73af\u6b21\u6570<br \/>\nline1Animal-&gt;start();<br \/>\n\/\/ \u8bbe\u7f6eline2\u7684\u52a8\u753b\u6548\u679c<br \/>\nline2Animal &#061; new QPropertyAnimation(ui-&gt;line2, &#034;geometry&#034;, this);<br \/>\nline2Animal-&gt;setDuration(1600);<br \/>\nline2Animal-&gt;setKeyValueAt(0, QRect(7, 15, 2, 0));<br \/>\nline2Animal-&gt;setKeyValueAt(0.5, QRect(7, 0, 2, 15));<br \/>\nline2Animal-&gt;setKeyValueAt(1, QRect(7, 15, 2, 0));<br \/>\nline2Animal-&gt;setLoopCount(-1);<br \/>\nline2Animal-&gt;start();<br \/>\n\/\/ \u8bbe\u7f6eline3\u7684\u52a8\u753b\u6548\u679c<br \/>\nline3Animal &#061; new QPropertyAnimation(ui-&gt;line3, &#034;geometry&#034;, this);<br \/>\nline3Animal-&gt;setDuration(1700);<br \/>\nline3Animal-&gt;setKeyValueAt(0, QRect(14, 15, 2, 0));<br \/>\nline3Animal-&gt;setKeyValueAt(0.5, QRect(14, 0, 2, 15));<br \/>\nline3Animal-&gt;setKeyValueAt(1, QRect(14, 15, 2, 0));<br \/>\nline3Animal-&gt;setLoopCount(-1);<br \/>\nline3Animal-&gt;start();<br \/>\n\/\/ \u8bbe\u7f6eline4\u7684\u52a8\u753b\u6548\u679c<br \/>\nline4Animal &#061; new QPropertyAnimation(ui-&gt;line4, &#034;geometry&#034;, this);<br \/>\nline4Animal-&gt;setDuration(1800);<br \/>\nline4Animal-&gt;setKeyValueAt(0, QRect(21, 15, 2, 0));<br \/>\nline4Animal-&gt;setKeyValueAt(0.5, QRect(21, 0, 2, 15));<br \/>\nline4Animal-&gt;setKeyValueAt(1, QRect(21, 15, 2, 0));<br \/>\nline4Animal-&gt;setLoopCount(-1);<br \/>\nline4Animal-&gt;start();<br \/>\n} <\/p>\n<p>\u52a8\u753b\u5e76\u4e0d\u662f\u6240\u6709\u9875\u9762\u90fd\u663e\u793a&#xff0c;\u53ea\u6709\u5f53\u524d\u9009\u4e2d\u7684\u9875\u9762\u663e\u793a&#xff0c;\u6240\u4ee5\u9ed8\u8ba4\u60c5\u51b5\u4e0b&#xff0c;\u52a8\u753b\u9690\u85cf\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8bbe\u7f6eaddlocal\u663e\u793a\u3002<\/p>\n<p> \/\/ btform.cpp\u7684\u4e2d\u65b0\u589e&#xff1a;<br \/>\nvoid btFrom::showAnimal()<br \/>\n{<br \/>\n \/\/ \u663e\u2f70linebox, \u8bbe\u7f6e\u989c\u2f8a\u4e3a\u7eff\u2f8a<br \/>\n ui-&gt;linebox-&gt;show();<br \/>\n} <\/p>\n<p>   QQMusic\u7684initUI\u4e2d\u8bbe\u7f6e\u9ed8\u8ba4\u9009\u4e2d <\/p>\n<p>  \/\/ \u672c\u5730\u4e0b\u8f7dBtForm\u52a8\u753b\u9ed8\u8ba4\u663e\u2f70<br \/>\n ui-&gt;local-&gt;showAnimal();<br \/>\n ui-&gt;stackedWidget-&gt;setCurrentIndex(4); <\/p>\n<h2><\/h2>\n<h2>\u63a8\u8350\u9875\u9762&#xff08;recPage\u7c7b&#xff09;<\/h2>\n<h3>1\u3001recPage\u81ea\u5b9a\u4e49<\/h3>\n<p>\u5206\u6790&#xff1a;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"451\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023826-68103ba2e7289.png\" width=\"442\" \/><\/p>\n<p>\u2460&#034;\u63a8\u8350&#034;\u6587\u672c\u63d0\u793a&#xff0c;\u5373QLabel \u2461&#034;\u4eca\u65e5\u4e3a\u4f60\u63a8\u8350&#034;\u6587\u672c\u63d0\u793a&#xff0c;\u5373QLabel \u2462\u5177\u4f53\u63a8\u8350\u7684\u6b4c\u66f2\u5185\u5bb9&#xff0c;\u70b9\u51fb\u5de6\u53f3\u4e24\u4fa7\u7ffb\u9875\u6309\u94ae&#xff0c;\u5177\u6709\u8f6e\u756a\u56fe\u6548\u679c&#xff0c;\u5c06\u5149\u6807\u653e\u5230\u56fe\u4e0a&#xff0c;\u6709\u56fe\u7247\u4e0a\u79fb\u52a8\u753b \u2463&#034;\u4f60\u7684\u6b4c\u66f2\u8865\u7ed9\u7ad9&#034;\u6587\u672c\u63d0\u793a&#xff0c;\u5373QLabel\u5177\u4f53\u663e\u793a\u97f3\u4e50&#xff0c;\u548c\u2462\u5b9e\u9645\u662f\u4e00\u6837\u7684&#xff0c;\u4e0d\u540c\u7684\u662f\u2462\u4e2d\u97f3\u4e50\u53ea\u6709\u4e00\u884c&#xff0c;\u2464\u4e2d\u7684\u97f3\u4e50\u6709\u4e24\u884c\u56e0\u4e3a\u9875\u9762\u4e2d\u5143\u7d20\u8f83\u591a&#xff0c;\u76f4\u63a5\u6446\u5230\u4e00\u4e2a\u9875\u9762\u592a\u62e5\u6324&#xff0c;\u4ece\u53f3\u4fa7\u7684\u6eda\u52a8\u6761\u53ef\u4ee5\u770b\u51fa&#xff0c;\u6574\u4e2a\u9875\u9762\u4e2d\u7684\u5143\u7d20\u90fd\u653e\u7f6e\u5728QScrollArea\u4e2d\u3002<\/p>\n<p> \u4ed4\u7ec6\u5206\u6790\u2462\u53d1\u73b0&#xff0c;\u91cc\u9762\u5305\u542b\u4e86&#xff1a;\u00a0<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"197\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023827-68103ba32c680.png\" width=\"647\" \/><\/p>\n<p>\u5de6\u53f3\u5404\u4e24\u4e2a\u6309\u94ae&#xff0c;\u70b9\u51fb\u4e4b\u540e\u4e2d\u95f4\u7684\u56fe\u7247\u4f1a\u5de6\u53f3\u79fb\u52a8&#xff0c;Qt\u4e2d\u672a\u63d0\u4f9b\u7c7b\u4f3c\u8be5\u79cd\u7ec4\u5408\u63a7\u4ef6&#xff0c;\u56e0\u6b64\u2462\u5b9e\u9645\u4e3a\u81ea\u5b9a\u4e49\u63a7\u4ef6\u3002 \u2462\u4e2d\u6309\u94ae\u4e4b\u95f4\u7684\u5143\u7d20&#xff0c;\u7531\u56fe\u7247\u548c\u5e95\u4e0b\u7684\u6587\u5b57\u7ec4\u6210&#xff0c;\u5f53\u5149\u6807\u653e\u5728\u56fe\u7247\u4e0a\u4f1a\u6709\u4e0a\u79fb\u7684\u52a8\u753b&#xff0c;\u56e0\u6b64\u8be5\u5143\u7d20\u5b9e\u9645\u4e5f\u4e3a\u81ea\u5b9a\u4e49\u63a7\u4ef6\u3002\u00a0<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"132\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023827-68103ba35a3fd.png\" width=\"104\" \/><\/p>\n<p>\u5b8c\u6210\u5e03\u5c40\u540e\u7684\u6548\u679c&#xff1a;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"461\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023827-68103ba37e41a.png\" width=\"1215\" \/><\/p>\n<h3>\u00a02\u3001\u81ea\u5b9a\u4e49recBox<\/h3>\n<p>\u5b8c\u6210\u5e03\u5c40\u540e\u7684\u6548\u679c<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"400\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023827-68103ba3ced3d.png\" width=\"979\" \/><\/p>\n<p>\u5c06QQMusic\u4e3b\u754c\u9762\u4e2drecPage\u9875\u9762\u4e2d\u7684recMusicBox\u548csupplyMusicBox\u63d0\u5347\u4e3aRecBox&#xff0c;\u5c31\u80fd\u770b\u5230\u5982\u4e0b\u6548\u679c\u3002\u00a0<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"215\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023828-68103ba4176df.png\" width=\"374\" \/><\/p>\n<h3>3\u3001\u81ea<span style=\"color:#1f2329\">\u5b9a\u4e49recBoxItem<\/span><\/h3>\n<p>\u5b8c\u6210\u5e03\u5c40\u540e\u7684\u6548\u679c<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"254\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023828-68103ba4560c5.png\" width=\"887\" \/><\/p>\n<h3>4\u3001<span style=\"color:#1f2329\">RecBoxItem\u7c7b\u4e2d\u6dfb\u52a0\u52a8\u753b\u6548\u679c<\/span>\u00a0<\/h3>\n<p> <span style=\"color:#1f2329\">\u5728RecBoxItem\u7c7b\u4e2d\u62e6\u622a\u9f20\u6807\u8fdb\u5165\u548c\u79bb\u5f00\u4e8b\u4ef6&#xff0c;\u5728\u8fdb\u5165\u65f6\u8ba9\u56fe\u7247\u4e0a\u79fb&#xff0c;\u5728\u79bb\u5f00\u65f6\u8ba9\u56fe\u7247\u4e0b\u79fb\u56de\u5230\u539f\u4f4d\u3002<\/span> <\/p>\n<p> <span style=\"color:#1f2329\">\u5728RecBoxItem.cpp\u65b0\u589e<\/span> <\/p>\n<p> #include &lt;QPropertyAnimation&gt;<br \/>\n#include &lt;QDebug&gt;<br \/>\nbool RecBoxItem::eventFilter(QObject* watched, QEvent* event)<br \/>\n{<br \/>\n    \/\/ \u6ce8\u610f&#xff1a;recItem\u4e0a\u6709\u2f00\u4e2a\u6309\u94ae&#xff0c;\u5f53\u2fcf\u6807\u653e\u5728\u6309\u94ae\u4e0a\u65f6\u5728\u5f00\u542f\u52a8\u753b<br \/>\n    if (watched &#061;&#061; ui-&gt;musicImageBox)<br \/>\n    {<br \/>\n        int ImgWidget &#061; ui-&gt;musicImageBox-&gt;width();<br \/>\n        int ImgHeight &#061; ui-&gt;musicImageBox-&gt;height();<br \/>\n        \/\/ \u62e6\u622a\u2fcf\u6807\u8fdb\u2f0a\u4e8b\u4ef6<br \/>\n        if (event-&gt;type() &#061;&#061; QEvent::Enter)<br \/>\n        {<br \/>\n            QPropertyAnimation* animation &#061; new QPropertyAnimation(ui -&gt; musicImageBox, &#034;geometry&#034;);<br \/>\n            animation-&gt;setDuration(100);<br \/>\n            animation-&gt;setStartValue(QRect(9, 10, ImgWidget, ImgHeight));<br \/>\n            animation-&gt;setEndValue(QRect(9, 0, ImgWidget, ImgHeight));<br \/>\n            animation-&gt;start();<br \/>\n            \/\/ \u6ce8\u610f&#xff1a;\u52a8\u753b\u7ed3\u675f\u7684\u65f6\u5019\u4f1a\u89e6\u53d1finished\u4fe1\u53f7&#xff0c;\u62e6\u622a\u5230\u8be5\u4fe1\u53f7&#xff0c;\u9500\u6bc1animation<br \/>\n            connect(animation, &amp;QPropertyAnimation::finished, this, [&#061;]() {<br \/>\n                delete animation;<br \/>\n                qDebug() &lt;&lt; &#034;\u56fe\u2f5a\u4e0a\u79fb\u52a8\u753b\u7ed3\u675f&#034;;<br \/>\n                });<br \/>\n            return true;<br \/>\n        }<br \/>\n        else if (event-&gt;type() &#061;&#061; QEvent::Leave)<br \/>\n        {<br \/>\n            \/\/ \u62e6\u622a\u2fcf\u6807\u79bb\u5f00\u4e8b\u4ef6<br \/>\n            QPropertyAnimation* animation &#061; new QPropertyAnimation(ui -&gt; musicImageBox, &#034;geometry&#034;);<br \/>\n            animation-&gt;setDuration(150);<br \/>\n            animation-&gt;setStartValue(QRect(9, 0, ImgWidget, ImgHeight));<br \/>\n            animation-&gt;setEndValue(QRect(9, 10, ImgWidget, ImgHeight));<br \/>\n            animation-&gt;start();<br \/>\n            \/\/ \u6ce8\u610f&#xff1a;\u52a8\u753b\u7ed3\u675f\u7684\u65f6\u5019\u4f1a\u89e6\u53d1finished\u4fe1\u53f7&#xff0c;\u62e6\u622a\u5230\u8be5\u4fe1\u53f7&#xff0c;\u9500\u6bc1animation<br \/>\n            connect(animation, &amp;QPropertyAnimation::finished, this, [&#061;]() {<br \/>\n                delete animation;<br \/>\n                qDebug() &lt;&lt; &#034;\u56fe\u2f5a\u4e0a\u79fb\u52a8\u753b\u7ed3\u675f&#034;;<br \/>\n                });<br \/>\n            return true;<br \/>\n        }<br \/>\n    }<br \/>\n    return QObject::eventFilter(watched, event);<br \/>\n} <\/p>\n<p>\u6ce8\u610f&#xff1a;\u62e6\u622a\u4e8b\u4ef6\u5904\u7406\u5668\u65f6\u4e00\u5b9a\u8981\u5148\u5b89\u88c5\u4e8b\u4ef6\u5904\u7406\u5668<\/p>\n<p> \/\/ \u6ce8\u610f&#xff1a;\u4e0d\u8981\u5fd8\u8bb0\u4e8b\u4ef6\u62e6\u622a\u5668\u5b89\u88c5&#xff0c;\u5426\u5219\u65f6\u95f4\u62e6\u622a\u4e0d\u5230&#xff0c;\u56e0\u6b64\u9700\u8981\u5728\u6784\u9020\u51fd\u6570\u4e2d\u6dfb\u52a0&#xff1a;<br \/>\n\/\/ \u62e6\u622a\u4e8b\u4ef6\u5904\u7406\u5668\u65f6&#xff0c;\u2f00\u5b9a\u8981\u5b89\u88c5\u4e8b\u4ef6\u62e6\u622a\u5668<br \/>\nui-&gt;musicImageBox-&gt;installEventFilter(this); <\/p>\n<p>\u8be5\u7c7b\u4e2d\u8fd8\u9700\u8981\u6dfb\u52a0\u8bbe\u7f6e\u63a8\u8350\u6587\u672c\u548c\u56fe\u7247\u7684\u65b9\u6cd5&#xff0c;\u5c06\u6765\u9700\u8981\u5728\u5916\u90e8\u6765\u8bbe\u7f6e\u6bcf\u4e2a\u91cd\u65b0\u6846\u9879\u76ee\u7684\u6587\u672c\u548c\u56fe \u7247&#xff1a;<\/p>\n<p> \/\/ RecBoxItem.cpp \u65b0\u589e<br \/>\nvoid RecBoxItem::setText(const QString&amp; text)<br \/>\n{<br \/>\n    ui-&gt;recBoxItemText-&gt;setText(text);<br \/>\n}<br \/>\nvoid RecBoxItem::setImage(const QString&amp; Imagepath)<br \/>\n{<br \/>\n    QString imgStyle &#061; &#034;border-image:url(&#034;&#043;Imagepath&#043;&#034;);&#034;;<br \/>\n    ui-&gt;recMusicImg-&gt;setStyleSheet(imgStyle);<br \/>\n} <\/p>\n<h3>5\u3001<span style=\"color:#1f2329\">RecBox\u6dfb\u52a0RecBoxItem<\/span><\/h3>\n<h4>\u56fe\u7247\u8def\u5f84\u548c\u63a8\u8350\u6587\u672c\u51c6\u5907<\/h4>\n<p><span style=\"color:#1f2329\">\u6bcf\u4e2aRecBoxltem\u90fd\u6709\u5bf9\u5e94\u7684\u56fe\u7247\u548c\u63a8\u8350\u6587\u672c&#xff0c;\u5728\u5f80RecBox\u4e2d\u6dfb\u52a0RecBoxltem\u524d\u9700\u8981\u5148\u5c06\u56fe\u7247\u8def\u5f84\u548c\u5bf9\u5e94\u6587\u672c\u51c6\u5907\u597d\u3002\u7531\u4e8e\u56fe\u7247\u548c\u6587\u672c\u5177\u6709\u5bf9\u5e94\u5173\u7cfb&#xff0c;\u53ef\u4ee5\u4ee5\u952e\u503c\u5bf9\u65b9\u5f0f\u6765\u8fdb\u884c\u7ec4\u7ec7&#xff0c;\u4ee5\u4e0b\u5b9e\u73b0\u7684\u65f6\u91c7\u7528QT\u5185\u7f6e\u7684QJsonObject\u5bf9\u8c61\u7ba1\u7406\u56fe\u7247\u8def\u5f84\u548c\u6587\u672c\u5185\u5bb9\u3002<\/span><\/p>\n<p><span style=\"color:#1f2329\">\u4f7f\u7528QT\u5185\u7f6e\u7684QJsonObject\u5bf9\u8c61\u7ba1\u7406\u56fe\u7247\u8def\u5f84\u548c\u6587\u672c\u5185\u5bb9&#xff0c;\u56fe\u7247\u8def\u5f84\u548c\u5bf9\u5e94\u6587\u672c\u7684\u51c6\u5907\u5de5\u4f5c&#xff0c;\u5e94\u8be5\u5728QQMusic\u7c7b\u4e2d\u5904\u7406\u597d&#xff0c;RecBoxItem\u53ea\u8d1f\u8d23\u8bbe\u7f6eRecBox&#xff0c;\u56e0\u6b64\u8be5\u51c6\u5907\u5de5\u4f5c\u9700\u8981\u5728QQMusic\u7c7b\u4e2d\u8fdb\u884c&#xff0c;\u5728QQMusic\u4e2d\u9700\u8981\u6dfb\u52a0\u5982\u4e0b\u4ee3\u7801&#xff1a;<\/span><\/p>\n<p> \/\/ \u8bbe\u7f6e\u968f\u673a\u56fe\u2f5a\u3010\u6b4c\u66f2\u7684\u56fe\u2f5a\u3011<br \/>\nQJsonArray QQMusic::randomPiction()<br \/>\n{<br \/>\n    \/\/ \u63a8\u8350\u2f42\u672c &#043; \u63a8\u8350\u56fe\u2f5a\u8def\u5f84<br \/>\n    QVector&lt;QString&gt; vecImageName;<br \/>\n    vecImageName &lt;&lt; &#034;001.png&#034; &lt;&lt; &#034;003.png&#034; &lt;&lt; &#034;004.png&#034; &lt;&lt; &#034;005.png&#034; &lt;&lt; &#034;006.png&#034; &lt;&lt; &#034;007.png&#034;<br \/>\n                 &lt;&lt; &#034;008.png&#034; &lt;&lt; &#034;009.png&#034; &lt;&lt; &#034;010.png&#034; &lt;&lt; &#034;011.png&#034; &lt;&lt; &#034;012.png&#034;&lt;&lt; &#034;013.png&#034;<br \/>\n                 &lt;&lt; &#034;014.png&#034; &lt;&lt; &#034;015.png&#034; &lt;&lt; &#034;016.png&#034; &lt;&lt; &#034;017.png&#034; &lt;&lt; &#034;018.png&#034;&lt;&lt; &#034;019.png&#034;<br \/>\n                 &lt;&lt; &#034;020.png&#034; &lt;&lt; &#034;021.png&#034; &lt;&lt; &#034;022.png&#034; &lt;&lt; &#034;023.png&#034; &lt;&lt; &#034;024.png&#034;&lt;&lt; &#034;025.png&#034;<br \/>\n                 &lt;&lt; &#034;026.png&#034; &lt;&lt; &#034;027.png&#034; &lt;&lt; &#034;028.png&#034; &lt;&lt; &#034;029.png&#034; &lt;&lt; &#034;030.png&#034;&lt;&lt; &#034;031.png&#034;<br \/>\n                 &lt;&lt; &#034;032.png&#034; &lt;&lt; &#034;033.png&#034; &lt;&lt; &#034;034.png&#034; &lt;&lt; &#034;035.png&#034; &lt;&lt; &#034;036.png&#034;&lt;&lt; &#034;037.png&#034;<br \/>\n                 &lt;&lt; &#034;038.png&#034; &lt;&lt; &#034;039.png&#034; &lt;&lt; &#034;040.png&#034;;<br \/>\n    std::random_shuffle(vecImageName.begin(), vecImageName.end());<br \/>\n    \/\/ 001.png<br \/>\n    \/\/ path: &#034;:\/images\/rec\/&#034;&#043;vecImageName[i];<br \/>\n    \/\/ text: &#034;\u63a8\u8350-001&#034;<br \/>\n    QJsonArray objArray;<br \/>\n    for (int i &#061; 0; i &lt; vecImageName.size(); &#043;&#043;i)<br \/>\n    {<br \/>\n        QJsonObject obj;<br \/>\n        obj.insert(&#034;path&#034;, &#034;:\/images\/rec\/&#034; &#043; vecImageName[i]);<br \/>\n        \/\/ arg(i, 3, 10, QCchar(&#039;0&#039;))<br \/>\n        \/\/ i&#xff1a;\u8981\u653e\u2f0a%1\u4f4d\u7f6e\u7684\u6570\u636e<br \/>\n        \/\/ 3: \u4e09\u4f4d\u6570<br \/>\n        \/\/ 10&#xff1a;\u8868\u2f70\u2f17\u8fdb\u5236\u6570<br \/>\n        \/\/ QChar(&#039;0&#039;)&#xff1a;\u6570\u5b57\u4e0d\u591f\u4e09\u4f4d&#xff0c;\u524d\u2faf\u2f64\u5b57\u7b26&#039;0&#039;\u586b\u5145<br \/>\n        QString strText &#061; QString(&#034;\u63a8\u8350-%1&#034;).arg(i, 3, 10, QChar(&#039;0&#039;));<br \/>\n        obj.insert(&#034;text&#034;, strText);<br \/>\n        objArray.append(obj);<br \/>\n    }<br \/>\n    return objArray;<br \/>\n} <\/p>\n<h4>recBox\u4e2d\u6dfb\u52a0\u5143\u7d20<\/h4>\n<p>\u7531\u4e8erecPage\u9875\u9762\u4e2d\u6709\u4e24\u4e2aRecBox\u63a7\u4ef6&#xff0c;\u4e0a\u9762\u7684RecBox\u4e3a\u4e00\u884c\u56db\u5217&#xff0c;\u4e0b\u65b9\u7684RecBox\u4e3a2\u884c\u56db\u5217&#xff0c;\u56e0\u6b64\u5728RecBox\u7c7b\u4e2d\u65b0\u589e\u52a0\u4ee5\u4e0b\u6210\u5458\u53d8\u91cf&#xff1a;<\/p>\n<p> #include &lt;QJsonArray&gt;<br \/>\npublic:<br \/>\n    void initRecBoxUi(QJsonArray data, int row);<\/p>\n<p>private:<br \/>\n    int row; \/\/ \u8bb0\u5f55\u5f53\u524dRecBox\u5b9e\u9645\u603b\u2f8f\u6570<br \/>\n    int col; \/\/ \u8bb0\u5f55\u5f53\u524dRecBox\u5b9e\u9645\u6bcf\u2f8f\u6709\u2f0f\u4e2a\u5143\u7d20<br \/>\n    QJsonArray imageList; \/\/ \u4fdd\u5b58\u754c\u2faf\u4e0a\u7684\u56fe\u2f5a, \u2fa5\u2faf\u5b9e\u9645\u4e3akey\u3001value\u952e\u503c\u5bf9 <\/p>\n<p>RecBox\u7684\u6784\u9020\u51fd\u6570\u4e2d&#xff0c;\u5c06row\u548ccol\u9ed8\u8ba4\u8bbe\u7f6e\u4e3a1\u548c4&#xff0c;count\u9700\u8981\u5177\u4f53\u6765\u8ba1\u7b97&#xff1a;<\/p>\n<p> RecBox::RecBox(QWidget* parent) :<br \/>\n    QWidget(parent),<br \/>\n    ui(new Ui::RecBox),<br \/>\n    row(1),<br \/>\n    col(4)<br \/>\n{<br \/>\n    ui-&gt;setupUi(this);<br \/>\n}<br \/>\nvoid RecBox::initRecBoxUi(QJsonArray data, int row)<br \/>\n{<br \/>\n    \/\/ \u5982\u679c\u662f\u4e24\u2f8f&#xff0c;\u8bf4\u660e\u5f53\u524dRecBox\u662f\u4e3b\u754c\u2faf\u4e0a\u7684supplyMusicBox<br \/>\n    if (2 &#061;&#061; row)<br \/>\n    {<br \/>\n        this-&gt;row &#061; row;<br \/>\n        this-&gt;col &#061; 8;<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        \/\/ \u5426\u5219&#xff1a;\u53ea\u6709\u2f00\u2f8f&#xff0c;\u4e3a\u4e3b\u754c\u2faf\u4e0arecMusicBox<br \/>\n        ui-&gt;recBoxBottom-&gt;hide();<br \/>\n    }<br \/>\n    \/\/ \u56fe\u2f5a\u4fdd\u5b58\u8d77\u6765<br \/>\n    imageList &#061; data;<br \/>\n    \/\/ \u5f80RecBox\u4e2d\u6dfb\u52a0\u56fe\u2f5a<br \/>\n    createRecItem();<br \/>\n}<br \/>\nvoid RecBox::createRecBoxItem()<br \/>\n{<br \/>\n    \/\/ \u521b\u5efaRecBoxItem\u5bf9\u8c61&#xff0c;\u5f80RecBox\u4e2d\u6dfb\u52a0<br \/>\n    \/\/ col<br \/>\n    for (int i &#061; 0; i &lt; col; &#043;&#043;i)<br \/>\n    {<br \/>\n        RecBoxItem* item &#061; new RecBoxItem();<br \/>\n        \/\/ \u8bbe\u7f6e\u2fb3\u4e50\u56fe\u2f5a\u4e0e\u5bf9\u5e94\u2f42\u672c<br \/>\n        QJsonObject obj &#061; imageList[i].toObject();<br \/>\n        item-&gt;setRecText(obj.value(&#034;text&#034;).toString());<br \/>\n        item-&gt;setRecImage(obj.value(&#034;path&#034;).toString());<br \/>\n        \/\/ recMusicBox&#xff1a;col\u4e3a4&#xff0c;\u5143\u7d20\u6dfb\u52a0\u5230ui-&gt;recListUpHLayout\u4e2d<br \/>\n        \/\/ supplyMuscBox: col\u4e3a8&#xff0c; ui-&gt;recListUpHLayout\u6dfb\u52a04\u4e2a&#xff0c;ui-&gt;recListDownHLayout\u6dfb\u52a04\u4e2a<br \/>\n        \/\/ \u5373supplyMuscBox\u4e0a\u4e0b\u4e24\u2f8f\u90fd\u8981\u6dfb\u52a0<br \/>\n        \/\/ \u5982\u679c\u662frecMusicBox&#xff1a;row\u4e3a1&#xff0c;\u53ea\u80fd\u6267\u2f8felse&#xff0c;\u6240\u67094\u4e2aRecBoxItem\u90fd\u6dfb\u52a0\u5230ui-&gt;recListUpHLayout\u4e2d<br \/>\n        \/\/ \u5982\u679c\u662fsupplyMuscBox&#xff1a;row\u4e3a2&#xff0c;col\u4e3a8&#xff0c;col\/2\u7ed3\u679c\u4e3a4&#xff0c;i\u4e3a0 1 2 3\u65f6&#xff0c;\u5143\u7d20\u6dfb\u52a0\u5230ui-&gt;recListDownHLayout\u4e2d<br \/>\n        \/\/ i\u4e3a4 5 6 7\u65f6&#xff0c;\u5143\u7d20\u6dfb\u52a0\u5230ui-&gt;recListUpHLayout\u4e2d<br \/>\n        if (i &gt;&#061; col \/ 2 &amp;&amp; row &#061;&#061; 2)<br \/>\n        {<br \/>\n            ui-&gt;recListDownHLayout-&gt;addWidget(item);<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            ui-&gt;recListUpHLayout-&gt;addWidget(item);<br \/>\n         }<br \/>\n    }<br \/>\n} <\/p>\n<h3>6\u3001RecBox\u4e2dbtUp\u548cbtDown\u6309\u94aeclicked\u5904\u7406<\/h3>\n<h4>\u6dfb\u52a0\u69fd\u51fd\u6570<\/h4>\n<p>\u9009\u4e2drecbox.ui\u6587\u4ef6&#xff0c;\u5206\u522b\u9009\u4e2dbtUp\u548cbtDown&#xff0c;\u53f3\u952e\u5355\u51fb\u5f39\u51fa\u83dc\u5355\u9009\u62e9\u8f6c\u5230\u69fd&#xff0c;\u9009\u4e2dclicked\u786e\u5b9a&#xff0c; btUp\u548cbtDown\u7684\u69fd\u51fd\u6570\u5c31\u6dfb\u52a0\u597d\u4e86\u3002<\/p>\n<p> void RecBox::on_btUp_clicked()<br \/>\n{<br \/>\n \/\/ \u70b9\u51fbbtUp\u6309\u94ae&#xff0c;\u663e\u2f70\u524d4\u5f20\u56fe\u2f5a&#xff0c;\u5982\u679c\u5df2\u7ecf\u662f\u7b2c\u2f00\u5f20\u56fe\u2f5a&#xff0c;\u5faa\u73af\u4ece\u540e\u5f80\u524d\u663e\u2f70<br \/>\n}<br \/>\nvoid RecBox::on_btDown_clicked()<br \/>\n{<br \/>\n \/\/ \u70b9\u51fbbtUp\u6309\u94ae&#xff0c;\u663e\u2f70\u524d8\u5f20\u56fe\u2f5a&#xff0c;\u5982\u679c\u5df2\u7ecf\u662f\u7b2c\u2f00\u5f20\u56fe\u2f5a&#xff0c;\u5faa\u73af\u4ece\u540e\u5f80\u524d\u663e\u2f70<br \/>\n} <\/p>\n<p>\u5047\u8bbeimageList\u4e2d\u670924\u7ec4\u56fe\u7247\u8def\u5f84\u548c\u63a8\u8350\u6587\u672c\u4fe1\u606f&#xff0c;\u5982\u679c\u5c06\u4fe1\u606f\u5206\u7ec4&#xff1a;<\/p>\n<p>\u5982\u679c\u662frecMusicBox&#xff0c;\u5c06\u5143\u7d20\u6309\u7167col\u5206\u7ec4&#xff0c;\u5373\u6bcf4\u4e2a\u5143\u7d20\u4e3a\u4e00\u7ec4&#xff0c;\u53ef\u5206\u4e3a6\u7ec4<\/p>\n<p>\u5982\u679c\u662fsupplyMuscBox&#xff0c;\u5c06\u5143\u7d20\u6309\u7167col\u5206\u7ec4&#xff0c;\u5373\u6bcf8\u4e2a\u5143\u7d20\u4e3a\u4e00\u7ec4&#xff0c;\u53ef\u5206\u4e3a3\u7ec4\u3002<\/p>\n<p>RecBox\u7c7b\u4e2d\u6dfb\u52a0currentIndex\u548ccount\u6574\u5f62\u6210\u5458\u53d8\u91cf&#xff0c;currentIndex\u8bb0\u5f55\u5f53\u524d\u663e\u793a\u7ec4&#xff0c;count\u8bb0\u5f55\u603b\u7684\u4fe1\u606f\u7ec4\u6570\u3002\u5f53\u70b9\u51fbbtUp\u65f6&#xff0c;currentIndex-&#xff0c;\u663e\u793a\u524d\u4e00\u7ec4&#xff0c;\u5982\u679ccurrentIndex\u5c0f\u4e8eO\u65f6&#xff0c;\u5c06\u5176\u8bbe\u7f6e\u4e3acount-1;<\/p>\n<p>\u70b9\u51fbbtDown\u6309\u94ae\u65f6&#xff0c;currentIndex&#043;&#043;\u663e\u793a\u4e0b\u4e00\u7ec4&#xff0c;\u5f53currentIndex\u4e3acount\u65f6&#xff0c;\u5c06count \u8bbe\u7f6e\u4e3a0\u3002<\/p>\n<p>\/\/ recbox.cpp \u4e2d\u65b0\u589e<br \/>\nvoid RecBox::initRecBoxUi(QJsonArray data, int row)<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    imageList &#061; data;<\/p>\n<p>    \/\/ \u9ed8\u8ba4\u663e\u2f70\u7b2c0\u7ec4<br \/>\n    currentIndex &#061; 0;<\/p>\n<p>    \/\/ \u8ba1\u7b97\u603b\u5171\u6709\u2f0f\u7ec4\u56fe\u2f5a&#xff0c;ceil\u8868\u2f70\u5411\u4e0a\u53d6\u6574<br \/>\n    count &#061; ceil(imageList.size() \/ col);<br \/>\n    \/\/ \u5728RecBox\u63a7\u4ef6\u6dfb\u52a0RecBoxItem<br \/>\n    createRecBoxItem();<br \/>\n}<br \/>\nvoid RecBox::on_btUp_clicked()<br \/>\n{<br \/>\n    \/\/ \u70b9\u51fbbtUp\u6309\u94ae&#xff0c;\u663e\u2f70\u524d\u2f00\u7ec4\u56fe\u2f5a&#xff0c;\u5982\u679c\u5df2\u7ecf\u662f\u7b2c\u2f00\u7ec4\u56fe\u2f5a&#xff0c;\u663e\u2f70\u6700\u540e\u2f00\u7ec4<br \/>\n    currentIndex&#8211;;<br \/>\n    if (currentIndex &lt; 0)<br \/>\n    {<br \/>\n        currentIndex &#061; 0;<br \/>\n    }<\/p>\n<p>    createRecBoxItem();<br \/>\n}<br \/>\nvoid RecBox::on_btDown_clicked()<br \/>\n{<br \/>\n    \/\/ \u70b9\u51fbbtDown\u6309\u94ae&#xff0c;\u663e\u2f70\u4e0b\u2f00\u7ec4\u56fe\u2f5a&#xff0c;\u5982\u679c\u5df2\u7ecf\u662f\u6700\u540e\u2f00\u7ec4\u56fe\u2f5a&#xff0c;\u663e\u2f70\u7b2c0\u7ec4<br \/>\n    currentIndex&#043;&#043;;<br \/>\n    if (currentIndex &gt;&#061; count)<br \/>\n    {<br \/>\n        currentIndex &#061; 0;<br \/>\n    }<br \/>\n    createRecBoxItem();<br \/>\n} <\/p>\n<h4>\u00a0\u5143\u7d20\u91cd\u590d\u5206\u6790<\/h4>\n<p>\u6bcf\u6b21btUp\u548cbtDown\u70b9\u51fb\u540e&#xff0c;\u5e94\u8be5\u663e\u793a\u524d\u4e00\u7ec4\u548c\u540e\u4e00\u7ec4\u56fe\u7247&#xff0c;\u7531\u4e8e\u4e4b\u524drecListUpHLayout\u548c recListDownHLayout\u4e2d\u5df2\u7ecf\u6709\u5143\u7d20\u4e86&#xff0c;\u56e0\u6b64\u9700\u8981\u5148\u5c06\u4e4b\u524d\u7684\u5143\u7d20\u5220\u9664\u6389\u3002<\/p>\n<p>\u5728RecBox::createRecBoxItem()\u6210\u5458\u51fd\u6570\u4e2d\u65b0\u52a0<\/p>\n<p>void RecBox::createRecBoxItem()<br \/>\n{<br \/>\n    \/\/ \u6ea2\u51fa\u6389\u4e4b\u524d\u65e7\u5143\u7d20<br \/>\n    QList&lt;RecBoxItem*&gt; recUpList &#061; ui-&gt;recListUp-&gt;findChildren&lt;RecBoxItem*&gt;();<br \/>\n    for (auto e : recUpList)<br \/>\n    {<br \/>\n        ui-&gt;recListUpHLayout-&gt;removeWidget(e);<br \/>\n        delete e;<br \/>\n    }<br \/>\n    QList&lt;RecBoxItem*&gt; recDownList &#061; ui-&gt;recListDown-&gt;findChildren&lt;RecBoxItem*&gt;();<br \/>\n    for (auto e : recDownList)<br \/>\n    {<br \/>\n        ui-&gt;recListDownHLayout-&gt;removeWidget(e);<br \/>\n        delete e;<br \/>\n    }<br \/>\n} <\/p>\n<h4>\u7a0b\u5e8f\u542f\u52a8\u65f6\u56fe\u7247\u968f\u673a\u663e\u793a<\/h4>\n<p>\u6bcf\u6b21\u7a0b\u5e8f\u542f\u52a8\u65f6&#xff0c;\u663e\u793a\u7684\u56fe\u7247\u90fd\u662f\u76f8\u540c\u7684&#xff0c;\u8fd9\u662f\u56e0\u4e3arandom_shuffle\u5728\u968f\u673a\u6253\u4e71\u5143\u7d20\u65f6&#xff0c;\u9700\u8981\u8bbe\u7f6e\u968f\u673a\u6570\u79cd\u5b50&#xff0c;\u5426\u5219\u9ed8\u8ba4\u4f7f\u7528\u7684\u79cd\u5b50\u662f\u76f8\u540c\u7684&#xff0c;\u5c31\u5bfc\u81f4\u6bcf\u6b21\u6253\u4e71\u7684\u7ed3\u679c\u90fd\u662f\u76f8\u540c\u7684&#xff0c;\u6240\u4ee5\u6bcf\u6b21\u7a0b\u5e8f\u542f\u52a8\u65f6RecBox\u4e2d\u663e\u793a\u7684\u5185\u5bb9\u90fd\u662f\u76f8\u540c\u7684&#xff0c;\u56e0\u6b64\u5728randomPiction()\u8c03\u7528\u4e4b\u524d\u9700\u8981\u8bbe\u7f6e\u968f\u673a\u6570\u79cd\u5b50\u3002<\/p>\n<p>QQMusic\u7c7b\u7684initUi\u51fd\u6570\u4e2d\u65b0\u589e&#xff1a;<\/p>\n<p> srand(time(NULL));<br \/>\nui-&gt;recMusicBox-&gt;initRecBoxUi(randomPiction(), 1);<br \/>\nui-&gt;supplyMuscBox-&gt;initRecBoxUi(randomPiction(), 2); <\/p>\n<h2>commonPage\u9875\u9762<\/h2>\n<h3>1\u3001commonPage\u9875\u9762\u5206\u6790<\/h3>\n<p>\u6211\u7684\u97f3\u4e50\u4e0b\u7684&#xff1a;\u6211\u559c\u6b22\u3001\u672c\u5730\u4e0b\u8f7d\u3001\u6700\u8fd1\u64ad\u653e\u4e09\u4e2a\u6309\u94ae\u8868\u9762\u4e0a\u770b\u5bf9\u5e94\u4e09\u4e2aPage\u9875\u9762&#xff0c;\u5206\u6790\u4e4b\u540e\u53d1\u73b0&#xff0c;\u8fd9\u4e09\u4e2aPage\u9875\u9762\u5b9e\u9645\u662f\u96f7\u540c\u7684&#xff0c;\u56e0\u6b64\u53ea\u9700\u8981\u5b9a\u4e49\u4e00\u4e2a\u9875\u9762CommonPage&#xff0c;\u5c06stackedWidget\u4e2d\u8fd9\u4e09\u4e2a\u9875\u9762\u7684\u7c7b\u578b\u63d0\u5347\u4e3aCommonPage\u5373\u53ef\u3002<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"238\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023828-68103ba48c7e4.png\" width=\"399\" \/><\/p>\n<p>\u2460\u9875\u9762\u8bf4\u660e&#xff0c;\u6bd4\u5982&#xff1a;\u672c\u5730\u97f3\u4e50&#xff0c;\u8be5\u90e8\u5206\u5b9e\u9645\u5c31\u662fQLabel\u7684\u63d0\u793a\u8bf4\u660e; \u2461\u6b63\u5728\u64ad\u653e\u97f3\u4e50\u56fe\u7247\u548c\u64ad\u653e\u5168\u90e8\u6309\u94ae; \u2462\u97f3\u4e50\u5217\u8868\u4e2d\u6bcf\u4e2a\u90e8\u5206\u7684\u6587\u672c\u63d0\u793a&#xff0c;\u5b9e\u9645\u5c31\u662f\u4e09\u4e2aQLabel \u2463\u672c\u9875\u9762\u5bf9\u5e94\u7684\u97f3\u4e50\u5217\u8868&#xff0c;\u5373QListWidget\u3002<\/p>\n<h3>2\u3001commonPage\u754c\u9762\u8bbe\u8ba1\u548c\u663e\u793a\u00a0<\/h3>\n<p>\u628aconnomPage\u7684\u754c\u9762\u5e03\u5c40\u548cQSS\u6837\u5f0f\u8bbe\u7f6e\u597d\u540e\u5206\u6790\u3002<\/p>\n<p>CommonPage\u9875\u9762\u662f\u6211\u559c\u6b22\u3001\u672c\u5730\u4e0b\u8f7d\u3001\u6700\u8fd1\u64ad\u653e\u4e09\u4e2a\u754c\u9762\u7684\u5171\u540c\u7c7b\u578b&#xff0c;\u56e0\u6b64\u8be5\u7c7b\u9700\u8981\u63d0\u4f9b\u8bbe\u7f6e&#xff1a;pageTittle\u548c musicImageLabel\u7684\u516c\u5171\u65b9\u6cd5&#xff0c;\u5c06\u6765\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6\u5b8c\u6210\u4e09\u4e2a\u754c\u9762\u4fe1\u606f\u7684\u8bbe\u7f6e&#xff0c;\u56e0\u6b64CommonPage\u7c7b\u9700\u8981\u6dfb\u52a0\u4e00\u4e2apublic\u7684setCommonPageUI\u51fd\u6570\u3002<\/p>\n<p>\/\/ commonpage.cpp \u4e2d\u65b0\u589e<br \/>\nvoid CommonPage::setCommonPageUI(const QString&amp; title, const QString&amp; image)<br \/>\n{<br \/>\n    \/\/ \u8bbe\u7f6e\u6807\u9898<br \/>\n    ui-&gt;pageTittle-&gt;setText(title);<br \/>\n    \/\/ \u8bbe\u7f6e\u5c01\u2faf\u680f<br \/>\n    ui-&gt;musicImageLabel-&gt;setPixmap(QPixmap(image));<br \/>\n    ui-&gt;musicImageLabel-&gt;setScaledContents(true);<br \/>\n} <\/p>\n<p>\u754c\u9762\u8bbe\u7f6e\u7684\u51fd\u6570\u9700\u8981\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6\u5c31\u5b8c\u6210\u597d\u914d\u7f6e&#xff0c;\u5373\u9700\u8981\u5728QQMusic\u7684initUi(\u51fd\u6570\u4e2d\u8c03\u7528\u5b8c\u6210\u8bbe\u7f6e&#xff1a;<\/p>\n<p>\/\/\u5728Widget::initUi()\u4e2d\u65b0\u589e<br \/>\n\/\/ \u8bbe\u7f6e\u6211\u559c\u6b22\u3001\u672c\u5730\u2fb3\u4e50\u3001\u6700\u8fd1\u64ad\u653e\u2eda\u2faf<br \/>\nui-&gt;likePage-&gt;setCommonPageUI(&#034;\u6211\u559c\u6b22&#034;, &#034;:\/images\/ilikebg.png&#034;);<br \/>\nui-&gt;localPage-&gt;setCommonPageUI(&#034;\u672c\u5730\u2fb3\u4e50&#034;, &#034;:\/images\/localbg.png&#034;);<br \/>\nui-&gt;recentPage-&gt;setCommonPageUI(&#034;\u6700\u8fd1\u64ad\u653e&#034;, &#034;:\/images\/recentbg.png&#034;); <\/p>\n<h2>\u81ea\u5b9a\u4e49ListItemBox<\/h2>\n<h3>1\u3001ListItemBox\u754c\u9762\u5206\u6790<\/h3>\n<p>CommonPage\u9875\u9762\u521b\u5efa\u597d\u4e4b\u540e&#xff0c;\u7b49\u97f3\u4e50\u52a0\u8f7d\u5230\u7a0b\u5e8f\u4e4b\u540e&#xff0c;\u5c31\u53ef\u4ee5\u5c06\u97f3\u4e50\u4fe1\u606f\u5f80CommonPage\u7684 pageMusicList\u4e2d\u663e\u793a\u4e86\u3002<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"192\" src=\"2025-04-29bit1qdadics.png\" width=\"333\" \/><\/p>\n<p>\u4e0a\u56fe\u6bcf\u884c\u90fd\u662fQListWidget\u4e2d\u7684\u4e00\u4e2a\u5143\u7d20&#xff0c;\u6bcf\u4e2a\u5143\u7d20\u4e2d\u5305\u542b\u591a\u4e2a\u63a7\u4ef6&#xff1a; \u2460\u6536\u85cf\u56fe\u6807&#xff0c;\u5373QLabel \u2461\u6b4c\u66f2\u540d\u79f0&#xff0c;\u5373QLabel \u2462VIP\u548cSQ&#xff0c;VIP\u5373\u6536\u8d39\u4f1a\u5458\u4e13\u4eab&#xff0c;SQ\u4e3a\u65e0\u635f\u97f3\u4e50&#xff0c;\u4e5f\u662f\u4e24\u4e2aQLabel \u2463\u6b4c\u624b\u540d\u79f0&#xff0c;\u5373QLabel \u2464\u97f3\u4e50\u4e13\u8f91\u540d\u79f0&#xff0c;\u5373QLabel \u6b64\u5904&#xff0c;\u9700\u8981\u5c06\u4e0a\u8ff0\u6240\u6709QLabel\u7ec4\u5408\u5728\u4e00\u8d77&#xff0c;\u4f5c\u4e3a\u4e00\u4e2a\u72ec\u7acb\u7684\u63a7\u4ef6&#xff0c;\u6dfb\u52a0\u5230QListWidget\u4e2d&#xff0c;\u56e0\u6b64\u8be5\u63a7\u4ef6\u4e5f\u9700\u8981\u81ea\u5b9a\u4e49\u3002\u00a0<\/p>\n<h3><span style=\"color:#1f2329\">2\u3001ListItemBox\u663e\u793a\u6d4b\u8bd5<\/span><\/h3>\n<p>\u8bbe\u7f6e\u5b8cListItemBox\u7684\u754c\u9762\u5e03\u5c40\u548cQSS\u6837\u5f0f\u8868\u540e&#xff0c;ListItemBox\u5c06\u6765\u8981\u6dfb\u52a0\u5230CommonPage\u9875\u9762\u4e2d\u7684QListWidget\u4e2d&#xff0c;\u56e0\u6b64\u5728CommonPage\u7c7b\u7684\u521d\u59cb\u5316\u65b9\u6cd5\u4e2d\u6dfb\u52a0\u5982\u4e0b\u4ee3\u7801&#xff1a;<\/p>\n<p>void CommonPage::setCommonPageUI(const QString&amp; title, const QString&amp; image)<br \/>\n{<br \/>\n     \/\/ \u8bbe\u7f6e\u6807\u9898<br \/>\n     ui-&gt;pageTittle-&gt;setText(title);<\/p>\n<p>    \/\/ \u8bbe\u7f6e\u5c01\u2faf\u680f<br \/>\n     ui-&gt;musicImageLabel-&gt;setPixmap(QPixmap(image));<\/p>\n<p>     ui-&gt;musicImageLabel-&gt;setScaledContents(true);<br \/>\n    \/\/ \u6d4b\u8bd5<br \/>\n    ListItemBox* listItemBox &#061; new ListItemBox(this);<br \/>\n    QListWidgetItem* listWidgetItem &#061; new QListWidgetItem(ui-&gt;pageMusicList);<br \/>\n    listWidgetItem-&gt;setSizeHint(QSize(ui-&gt;pageMusicList-&gt;width(), 45));<br \/>\n    ui-&gt;pageMusicList-&gt;setItemWidget(listWidgetItem, listItemBox);<br \/>\n} <\/p>\n<p>3\u3001\u652f\u6301hover\u6548\u679c<\/p>\n<p>ListltemBox\u6dfb\u52a0\u5230CommonPage\u4e2d\u7684QListWidget\u4e4b\u540e&#xff0c;\u81ea\u5e26hover\u6548\u679c&#xff0c;\u4f46\u662f\u80cc\u666f\u989c\u8272\u548c\u754c\u9762\u4e0d\u592a\u642d\u914d&#xff0c;\u6b64\u5904\u91cd\u65b0\u5b9e\u73b0hover\u6548\u679c&#xff0c;\u6b64\u5904\u91cd\u5199enterEvent\u548cleaveEvent\u6765\u5b9e\u73b0hover\u6548\u679c\u3002<\/p>\n<p>\/\/ listitembox.cpp \u65b0\u589e<br \/>\nvoid ListItemBox::enterEvent(QEvent* event)<br \/>\n{<br \/>\n    (void)event;<br \/>\n    setStyleSheet(&#034;background-color:#EFEFEF&#034;);<br \/>\n}<br \/>\nvoid ListItemBox::leaveEvent(QEvent* event)<br \/>\n{<br \/>\n    (void)event;<br \/>\n    setStyleSheet(&#034;&#034;);<br \/>\n} <\/p>\n<h2><span style=\"color:#1f2329\">\u81ea\u5b9a\u4e49MusicSlider<\/span><\/h2>\n<p><span style=\"color:#1f2329\">\u7531\u4e8eQT\u5185\u7f6e\u7684HorizontalSlider(\u6c34\u5e73\u6ed1\u7aff)\u4e0d\u662f\u5f88\u597d\u770b&#xff0c;\u8be5\u63a7\u4ef6\u4e5f\u91c7\u7528\u81ea\u5b9a\u4e49\u3002\u8be5\u63a7\u4ef6\u6bd4\u8f83\u7b80\u5355&#xff0c;\u5b9e\u9645\u5c31\u662f\u4e24\u4e2aQFrame\u5d4c\u5957\u8d77\u6765\u7684&#xff0c;\u8fbe\u5230\u5982\u4e0b\u6548\u679c&#xff1a;<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"88\" src=\"2025-04-29wlrjjbav1wn.png\" width=\"905\" \/><\/p>\n<h2>\u00a0\u81ea<span style=\"color:#1f2329\">\u5b9a\u4e49VolumeTool<\/span><\/h2>\n<h3>1\u3001VolumeTool\u63a7\u4ef6\u5206\u6790<\/h3>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"184\" src=\"2025-04-29qxq0f3jxbn0.png\" width=\"70\" \/><\/p>\n<p>\u2460\u5185\u90e8\u4e3a\u7c7b\u4f3cMusicSlider\u63a7\u4ef6&#043;\u5c0f\u5706\u7403&#xff0c;\u5706\u7403\u5b9e\u9645\u4e3a\u4e00\u4e2aQPushButton \u97f3\u91cf\u5927\u5c0f\u6587\u672c\u663e\u793a&#xff0c;\u5b9e\u9645\u4e3aQLabel \u2462QPushButton&#xff0c;\u70b9\u51fb\u4e4b\u540e\u5728\u9759\u97f3\u548c\u53d6\u6d88\u9759\u97f3\u5207\u6362 \u2463\u4e00\u4e2a\u5012\u4e09\u89d2&#xff0c;Qt\u672a\u63d0\u4f9b\u4e09\u89d2\u63a7\u4ef6&#xff0c;\u8be5\u63a7\u4ef6\u9700\u8981\u624b\u52a8\u7ed8\u5236&#xff0c;\u7528\u6765\u63d0\u793a\u662f\u64ad\u653e\u63a7\u5236\u533a\u90a3\u4e2a\u6309\u94ae\u6309\u4e0b<\/p>\n<h3>2\u3001\u754c\u9762\u8bbe\u8ba1<\/h3>\n<p>\u8be5\u63a7\u4ef6\u5c5e\u4e8e\u5f39\u51fa\u7a97\u53e3&#xff0c;\u5373\u70b9\u51fb\u4e86\u4e3b\u754c\u9762\u7684\u97f3\u91cf\u8c03\u8282\u6309\u94ae\u540e&#xff0c;\u624d\u9700\u8981\u5f39\u51fa\u8be5\u754c\u9762&#xff0c;\u70b9\u51fb\u5176\u4ed6\u4f4d\u7f6e\u8be5\u754c\u9762\u81ea\u52a8\u9690\u85cf\u3002\u56e0\u6b64\u5728\u7a97\u53e3\u521b\u5efa\u65f6&#xff0c;\u9700\u8981\u8bbe\u7f6e\u7a97\u53e3\u4e3a\u65e0\u8fb9\u6846\u4ee5\u53ca\u4e3a\u5f39\u51fa\u7a97\u53e3\u3002<\/p>\n<p>\/\/ VolumeTool.cpp \u7684\u6784\u9020\u51fd\u6570\u4e2d\u6dfb\u52a0\u5982\u4e0b\u4ee3\u7801<br \/>\n#include &lt;QGraphicsDropShadowEffect&gt;<br \/>\nVolumeTool::VolumeTool(QWidget* parent) :<br \/>\n    QWidget(parent),<br \/>\n    ui(new Ui::VolumeTool)<br \/>\n{<br \/>\n    ui-&gt;setupUi(this);<br \/>\n    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);<br \/>\n    \/\/ \u5728windows\u4e0a&#xff0c;\u8bbe\u7f6e\u900f\u660e\u6548\u679c\u540e&#xff0c;\u7a97\u2f1d\u9700\u8981\u52a0\u4e0aQt::FramelessWindowHint\u683c\u5f0f<br \/>\n    \/\/ \u5426\u5219\u6ca1\u6709\u63a7\u4ef6\u4f4d\u7f6e\u7684\u80cc\u666f\u662f\u2fca\u2f8a\u7684<br \/>\n    \/\/ \u7531\u4e8e\u9ed8\u8ba4\u7a97\u2f1d\u6709\u9634\u5f71&#xff0c;\u56e0\u6b64\u8fd8\u9700\u8981\u5c06\u7a97\u2f1d\u7684\u539f\u6709\u7684\u9634\u5f71\u53bb\u6389&#xff0c;\u7a97\u2f1d\u9700\u8981\u52a0\u4e0aQt::NoDropShadowWindowHint<br \/>\n    setAttribute(Qt::WA_TranslucentBackground);<br \/>\n    \/\/ \u2f83\u5b9a\u4e49\u9634\u5f71\u6548\u679c<br \/>\n    QGraphicsDropShadowEffect* shadowEffect &#061; new QGraphicsDropShadowEffect(this);<br \/>\n    shadowEffect-&gt;setOffset(0, 0);<br \/>\n    shadowEffect-&gt;setColor(&#034;#646464&#034;);<br \/>\n    shadowEffect-&gt;setBlurRadius(10);<br \/>\n    setGraphicsEffect(shadowEffect);<br \/>\n    \/\/ \u7ed9\u6309\u94ae\u8bbe\u7f6e\u56fe\u6807<br \/>\n    ui-&gt;silenceBtn-&gt;setIcon(QIcon(&#034;:\/images\/volumn.png&#034;));<br \/>\n    \/\/ \u2fb3\u91cf\u7684\u9ed8\u8ba4\u2f24\u2f29\u662f20<br \/>\n    ui-&gt;outLine-&gt;setGeometry(ui-&gt;outLine-&gt;x(), 180 &#8211; 36 &#8211; 25, ui-&gt;outLine -&gt; width(), 20);\/\/\u6839\u636e\u81ea\u5b9a\u4e49\u7684\u63a7\u4ef6\u5927\u5c0f\u6765<br \/>\n    ui-&gt;silderBtn-&gt;move(ui-&gt;silderBtn-&gt;x(), ui-&gt;outLine-&gt;y() &#8211; ui -&gt; silderBtn-&gt;height() \/ 2);<br \/>\n    ui-&gt;volumeRatio-&gt;setText(&#034;20%&#034;);<br \/>\n} <\/p>\n<h3>\u00a03\u3001\u754c\u9762\u521b\u5efa\u53ca\u5f39\u51fa<\/h3>\n<p>\u97f3\u91cf\u8c03\u8282\u5c5e\u4e8e\u4e3b\u754c\u9762\u4e0a\u5143\u7d20&#xff0c;\u56e0\u6b64\u5728QQMusic\u7c7b\u4e2d\u9700\u8981\u6dfb\u52a0VolumeTool\u7684\u5bf9\u8c61&#xff0c;\u5728initUi\u4e2dnew\u8be5\u7c7b\u7684\u5bf9\u8c61\u3002\u4e3b\u754c\u9762\u4e2d\u97f3\u91cf\u8c03\u8282\u6309\u94ae\u6dfb\u52a0clicked\u69fd\u51fd\u6570\u3002<\/p>\n<p>\/\/ qqmusic.cpp\u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::initUi()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u521b\u5efa\u2fb3\u91cf\u8c03\u8282\u7a97\u2f1d\u5bf9\u8c61\u5e76\u6302\u5230\u5bf9\u8c61\u6811<br \/>\n    volumeTool &#061; new VolumeTool(this);<br \/>\n}<br \/>\nvoid QQMusic::on_volume_clicked()<br \/>\n{<br \/>\n    \/\/ \u5148\u8981\u8c03\u6574\u7a97\u2f1d\u7684\u663e\u2f70\u4f4d\u7f6e&#xff0c;\u5426\u5219\u8be5\u7a97\u2f1d\u5728\u4e3b\u7a97\u2f1d\u7684\u5de6\u4e0a\u2ec6<br \/>\n    \/\/ 1. \u83b7\u53d6\u8be5\u6309\u94ae\u5de6\u4e0a\u2ec6\u7684\u5de6\u6807<br \/>\n    QPoint point &#061; ui-&gt;volume-&gt;mapToGlobal(QPoint(0, 0));<br \/>\n    \/\/ 2. \u8ba1\u7b97volume\u7a97\u2f1d\u7684\u5de6\u4e0a\u2ec6\u4f4d\u7f6e<br \/>\n    \/\/ \u8ba9\u8be5\u7a97\u2f1d\u663e\u2f70\u5728\u2fcf\u6807\u70b9\u51fb\u7684\u6b63\u4e0a\u2f45<br \/>\n    \/\/ \u2fcf\u6807\u4f4d\u7f6e&#xff1a;\u51cf\u53bb\u7a97\u2f1d\u5bbd\u5ea6\u7684\u2f00\u534a&#xff0c;\u4ee5\u53ca\u2fbc\u5ea6\u6070\u5de7\u5c31\u662f\u7a97\u2f1d\u7684\u5de6\u4e0a\u2ec6<br \/>\n    QPoint volumeLeftTop &#061; point &#8211; QPoint(volumeTool-&gt;width() \/ 2, volumeTool -&gt; height());<br \/>\n    \/\/ \u5fae\u8c03\u7a97\u2f1d\u4f4d\u7f6e<br \/>\n    volumeLeftTop.setY(volumeLeftTop.y() &#043; 30);<br \/>\n    volumeLeftTop.setX(volumeLeftTop.x() &#043; 15);<\/p>\n<p>    \/\/ 3. \u79fb\u52a8\u7a97\u2f1d\u4f4d\u7f6e<br \/>\n    volumeTool-&gt;move(volumeLeftTop);<br \/>\n    \/\/ 4. \u5c06\u7a97\u2f1d\u663e\u2f70\u51fa\u6765<br \/>\n    volumeTool-&gt;show();<br \/>\n} <\/p>\n<h3>4\u3001\u7ed8\u5236\u4e09\u89d2<\/h3>\n<p>\u7531\u4e8eQt\u4e2d\u5e76\u672a\u7ed9\u51fa\u4e09\u89d2\u63a7\u4ef6&#xff0c;\u56e0\u6b64\u4e09\u89d2\u9700\u8981\u624b\u52a8\u7ed8\u5236&#xff0c;\u6545\u5728VolumeTool\u7c7b\u4e2d\u91cd\u5199paintEvent\u4e8b\u4ef6\u51fd \u6570\u3002<\/p>\n<p>\/\/ volumetool.cpp\u4e2d\u65b0\u589e<br \/>\n#include &lt;QPainter&gt;<br \/>\nvoid VolumeTool::paintEvent(QPaintEvent* event)<br \/>\n{<br \/>\n    (void)event;<br \/>\n    \/\/ 1. \u521b\u5efa\u7ed8\u56fe\u5bf9\u8c61<br \/>\n    QPainter painter(this);<br \/>\n    \/\/ 2. \u8bbe\u7f6e\u6297\u952f\u2eee<br \/>\n    painter.setRenderHint(QPainter::Antialiasing, true);<br \/>\n    \/\/ 3. \u8bbe\u7f6e\u753b\u7b14<br \/>\n    \/\/ \u6ca1\u6709\u753b\u7b14\u65f6&#xff1a;\u753b\u51fa\u6765\u7684\u56fe\u5f62\u5c31\u6ca1\u6709\u8fb9\u6846\u548c\u8f6e\u5ed3\u7ebf<br \/>\n    painter.setPen(Qt::NoPen);<br \/>\n    \/\/ 4. \u8bbe\u7f6e\u753b\u5237\u989c\u2f8a<br \/>\n    painter.setBrush(Qt::white);<br \/>\n    \/\/ \u521b\u5efa\u2f00\u4e2a\u4e09\u2ec6\u5f62<br \/>\n    QPolygon polygon;<br \/>\n    polygon.append(QPoint(30, 300));\/\/\u5750\u6807\u6839\u636evooltool\u63a7\u4ef6\u6765\u786e\u5b9a<br \/>\n    polygon.append(QPoint(70, 300));<br \/>\n    polygon.append(QPoint(50, 320));<br \/>\n    \/\/ \u7ed8\u5236\u4e09\u2ec6\u5f62<br \/>\n    painter.drawPolygon(polygon);<br \/>\n} <\/p>\n<h2>\u97f3\u4e50\u7ba1\u7406<\/h2>\n<h3>1\u3001\u97f3\u4e50\u52a0\u8f7d<\/h3>\n<p>QQMusic\u7c7b\u4e2d\u7ed9addLocal\u6dfb\u52a0\u69fd\u51fd\u6570\u3002\u97f3\u4e50\u6587\u4ef6\u5728\u78c1\u76d8\u4e2d&#xff0c;\u53ef\u4ee5\u501f\u52a9QFileDialog\u7c7b\u5b8c\u6210\u97f3\u4e50\u6587\u4ef6\u52a0\u8f7d\u3002<\/p>\n<p>\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\n#include &lt;QDir&gt;<br \/>\n#include &lt;QFileDialog&gt;<br \/>\nvoid QQMusic::on_addLocal_clicked()<br \/>\n{<br \/>\n    \/\/ 1. \u521b\u5efa\u2f00\u4e2a\u2f42\u4ef6\u5bf9\u8bdd\u6846<br \/>\n    QFileDialog fileDialog(this);<br \/>\n    fileDialog.setWindowTitle(&#034;\u6dfb\u52a0\u672c\u5730\u2fb3\u4e50&#034;);<br \/>\n    \/\/ 2. \u521b\u5efa\u2f00\u4e2a\u6253\u5f00\u683c\u5f0f\u7684\u2f42\u4ef6\u5bf9\u8bdd\u6846<br \/>\n    fileDialog.setAcceptMode(QFileDialog::AcceptOpen);<br \/>\n    \/\/ 3. \u8bbe\u7f6e\u5bf9\u8bdd\u6846\u6a21\u5f0f<br \/>\n    \/\/ \u53ea\u80fd\u9009\u62e9\u2f42\u4ef6&#xff0c;\u5e76\u4e14\u2f00\u6b21\u6027\u53ef\u4ee5\u9009\u62e9\u591a\u4e2a\u5b58\u5728\u7684\u2f42\u4ef6<br \/>\n    fileDialog.setFileMode(QFileDialog::ExistingFiles);<br \/>\n    \/\/ 4. \u8bbe\u7f6e\u5bf9\u8bdd\u6846\u7684MIME\u8fc7\u6ee4\u5668<br \/>\n    QStringList mimeList;<br \/>\n    mimeList &lt;&lt; &#034;application\/octet-stream&#034;;<br \/>\n    fileDialog.setMimeTypeFilters(mimeList);<br \/>\n    \/\/ 5. \u8bbe\u7f6e\u5bf9\u8bdd\u6846\u9ed8\u8ba4\u7684\u6253\u5f00\u8def\u5f84,\u8bbe\u7f6e\u2f6c\u5f55\u4e3a\u5f53\u524d\u2f2f\u7a0b\u6240\u5728\u2f6c\u5f55<br \/>\n    QDir dir(QDir::currentPath());<br \/>\n    dir.cdUp();<br \/>\n    QString musicPath &#061; dir.path() &#043; &#034;\/QQMusic\/musics\/&#034;;<br \/>\n    fileDialog.setDirectory(musicPath);<br \/>\n    \/\/ 6. \u663e\u2f70\u5bf9\u8bdd\u6846&#xff0c;\u5e76\u63a5\u6536\u8fd4\u56de\u503c<br \/>\n    \/\/ \u6a21\u6001\u5bf9\u8bdd\u6846, exec\u5185\u90e8\u662f\u6b7b\u5faa\u73af\u5904\u7406<br \/>\n    if (fileDialog.exec() &#061;&#061; QFileDialog::Accepted)<br \/>\n    {<br \/>\n        \/\/ \u5207\u6362\u5230\u672c\u5730\u2fb3\u4e50\u754c\u2faf&#xff0c;\u56e0\u4e3a\u52a0\u8f7d\u5b8c\u7684\u2fb3\u4e50\u9700\u8981\u5728\u672c\u5730\u2fb3\u4e50\u754c\u2faf\u663e\u2f70<br \/>\n        ui-&gt;stackedWidget-&gt;setCurrentIndex(4);<br \/>\n        \/\/ \u83b7\u53d6\u5bf9\u8bdd\u6846\u7684\u8fd4\u56de\u503c<br \/>\n        QList&lt;QUrl&gt; urls &#061; fileDialog.selectedUrls();<br \/>\n        \/\/ \u62ff\u5230\u6b4c\u66f2\u2f42\u4ef6\u540e&#xff0c;\u5c06\u6b4c\u66f2\u2f42\u4ef6\u4ea4\u7531musicList\u8fdb\u2f8f\u7ba1\u7406<br \/>\n        \/\/ &#8230;<br \/>\n    }<br \/>\n} <\/p>\n<h2>MusicList\u7c7b<\/h2>\n<p>\u5c06\u6765\u6dfb\u52a0\u5230\u64ad\u653e\u5668\u4e2d\u7684\u97f3\u4e50\u6bd4\u8f83\u591a&#xff0c;\u53ef\u501f\u52a9\u4e00\u4e2a\u7c7b\u5bf9\u6240\u6709\u7684\u97f3\u4e50\u8fdb\u884c\u7ba1\u7406\u3002<\/p>\n<h3>1\u3001\u6b4c\u66f2\u5bf9\u8c61\u5b58\u50a8<\/h3>\n<p>\u6bcf\u9996\u97f3\u4e50\u6587\u4ef6&#xff0c;\u5c06\u6765\u9700\u8981\u83b7\u53d6\u5176\u5185\u90e8\u7684\u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u624b\u3001\u97f3\u4e50\u4e13\u8f91\u3001\u6b4c\u66f2\u65f6\u957f\u7b49\u4fe1\u606f&#xff0c;\u56e0\u6b64\u5728 MusicList\u7c7b\u4e2d&#xff0c;\u5c06\u6240\u6709\u7684\u6b4c\u66f2\u6587\u4ef6\u4ee5Music\u5bf9\u8c61\u65b9\u5f0f\u7ba1\u7406\u8d77\u6765\u3002\u5728QQMusic\u4e2d&#xff0c;\u901a\u8fc7QFileDialog\u5c06\u4e00\u7ec4\u97f3\u4e50\u6587\u4ef6\u7684url\u83b7\u53d6\u5230\u4e4b\u540e&#xff0c;\u53ef\u4ee5\u4ea4\u7ed9MusicList\u7c7b\u6765\u7ba1\u7406\u3002\u4f46\u662fQQMusic\u52a0\u8f7d\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e0d\u4e00\u5b9a\u5168\u90e8\u90fd\u662f\u97f3\u4e50\u6587\u4ef6&#xff0c;\u56e0\u6b64MusicList\u7c7b\u4e2d\u9700\u8981\u5bf9\u6587\u4ef6\u7684MIME\u7c7b\u578b\u518d\u6b21\u68c0\u6d4b&#xff0c;\u4ee5\u7b5b\u9009\u51fa\u771f\u6b63\u7684\u97f3\u4e50\u6587\u4ef6\u3002<\/p>\n<p>QMimeDatabase\u7c7b\u662fQt\u4e2d\u4e3b\u8981\u7528\u4e8e\u5904\u7406\u6587\u4ef6\u7684MIME\u7c7b\u578b&#xff0c;\u7ecf\u5e38\u7528\u4e8e&#xff1a;\u6587\u4ef6\u7c7b\u578b\u8bc6\u522b\u3001\u6587\u4ef6\u8fc7\u6ee4 \u3001\u591a\u5a92\u4f53\u6587\u4ef6\u5904\u7406\u3001\u6587\u4ef6\u5bfc\u5165\u5bfc\u51fa\u3001\u6587\u4ef6\u7ba1\u7406\u5668&#xff0c;<span style=\"color:#1f2329\">\u8be5\u7c7b\u4e2d\u7684mimeTypeForFile\u51fd\u6570\u53ef\u7528\u4e8e\u83b7\u53d6\u7ed9\u5b9a\u6587\u4ef6\u7684MIME\u7c7b\u578b\u3002<\/span><\/p>\n<p>  <span style=\"color:#1f2329\">\u5bf9\u4e8e\u6b4c\u66f2\u6587\u4ef6&#xff1a; audio\/mpeg:\u9002\u7528\u4e8emp3\u683c\u5f0f\u7684\u97f3\u4e50\u6587\u4ef6 audio\/flac:\u65e0\u635f\u538b\u7f29\u7684\u97f3\u9891\u6587\u4ef6&#xff0c;\u4e0d\u4f1a\u7834\u574f\u4efb\u4f55\u539f\u6709\u7684\u97f3\u9891\u4fe1\u606f audio\/wav&#xff1a;\u8868\u793awav\u683c\u5f0f\u7684\u6b4c\u66f2\u6587\u4ef6 \u4e0a\u8ff0\u6b4c\u66f2\u6587\u4ef6\u683c\u5f0f&#xff0c;Qt\u7684QMediaPlayer\u7c7b\u90fd\u662f\u652f\u6301\u7684\u3002<\/span> <\/p>\n<p>\/\/ musiclist.h \u4e2d\u65b0\u589e<br \/>\n#include &lt;QVector&gt;<br \/>\nQVector&lt;Music&gt; musicList; \/\/ Music\u7c7b\u662f\u2f83\u5b9a\u4e49\u7684C&#043;&#043;\u7c7b&#xff0c;\u63cf\u8ff0\u6b4c\u66f2\u76f8\u5173\u4fe1\u606f<br \/>\n\/\/ \u5c06QQMusic\u2eda\u2faf\u4e2d\u8bfb\u53d6\u5230\u7684\u2fb3\u4e50\u2f42\u4ef6&#xff0c;\u68c0\u6d4b\u662f\u2fb3\u4e50\u2f42\u4ef6\u540e\u6dfb\u52a0\u5230musicList\u4e2d<br \/>\nvoid addMusicByUrl(const QList&lt;QUrl&gt;&amp; urls);<br \/>\n\/\/ musiclist.cpp\u4e2d\u65b0\u589e<br \/>\nvoid MusicList::addMusicByUrl(const QList&lt;QUrl&gt;&amp; urls)<br \/>\n{<br \/>\n    for (auto musicUrl : urls)<br \/>\n    {<br \/>\n        \/\/ \u7531\u4e8e\u6dfb\u52a0\u8fdb\u6765\u7684\u2f42\u4ef6\u4e0d\u2f00\u5b9a\u662f\u6b4c\u66f2\u2f42\u4ef6&#xff0c;\u56e0\u6b64\u9700\u8981\u518d\u6b21\u7b5b\u9009\u51fa\u2fb3\u4e50\u2f42\u4ef6<br \/>\n        QMimeDatabase db;<br \/>\n        QMimeType mime &#061; db.mimeTypeForFile(musicUrl.toLocalFile());<br \/>\n        if (mime.name() !&#061; &#034;audio\/mpeg&#034; &amp;&amp; mime.name() !&#061; &#034;audio\/flac&#034;)<br \/>\n        {<br \/>\n            continue;<br \/>\n        }<br \/>\n        \/\/ \u5982\u679c\u662f\u2fb3\u4e50\u2f42\u4ef6&#xff0c;\u52a0\u2f0a\u6b4c\u66f2\u5217\u8868<br \/>\n        musicList.push_back(musicUrl);<br \/>\n    }<br \/>\n} <\/p>\n<h2>\u00a0Music\u7c7b<\/h2>\n<h3>1\u3001\u4ecb\u7ecd<\/h3>\n<p>\u8be5\u7528\u6765\u63cf\u8ff0\u4e00\u4e2a\u97f3\u4e50\u6587\u4ef6&#xff0c;\u6bd4\u5982&#xff1a;\u97f3\u4e50\u540d\u79f0\u3001\u6b4c\u624b\u540d\u79f0\u3001\u4e13\u8f91\u540d\u79f0\u3001\u97f3\u4e50\u6301\u7eed\u65f6\u957f&#xff0c;\u5f53\u5728\u754c\u9762\u4e0a\u70b9\u51fb\u6536\u85cf\u4e4b\u540e&#xff0c;\u97f3\u4e50\u4f1a\u88ab\u6807\u8bb0\u4e3a\u559c\u6b22&#xff0c;\u64ad\u653e\u4e4b\u540e\u9700\u8981\u6807\u8bb0\u4e3a\u5386\u53f2\u8bb0\u5f55\u3002\u56e0\u6b64\u8be5\u7c7b\u4e2d\u81f3\u5c11\u9700\u8981\u4ee5\u4e0b\u6210\u5458&#xff1a;<\/p>\n<p>\/\/ music.h\u4e2d\u65b0\u589e<br \/>\n#include &lt;QUrl&gt;<br \/>\n#include &lt;QString&gt;<br \/>\nclass Music<br \/>\n{<br \/>\npublic:<br \/>\n    Music();<br \/>\n    Music(const QUrl&amp; url);<br \/>\n    void setIsLike(bool isLike);<br \/>\n    void setIsHistory(bool isHistory);<br \/>\n    void setMusicName(const QString&amp; musicName);<br \/>\n    void setSingerName(const QString&amp; singerName);<br \/>\n    void setAlbumName(const QString&amp; albumName);<br \/>\n    void setDuration(const qint64 duration);<br \/>\n    void setMusicUrl(const QUrl&amp; url);<br \/>\n    void setMusicId(const QString&amp; musicId);<br \/>\n    bool getIsLike();<br \/>\n    bool getIsHistory();<br \/>\n    QString getMusicName();<br \/>\n    QString getSingerName();<br \/>\n    QString getAlbumName();<br \/>\n    qint64 getDuration();<br \/>\n    QUrl getMusicUrl();<br \/>\n    QString getMusicId();<br \/>\nprivate:<br \/>\n    bool isLike; \/\/ \u6807\u8bb0\u2fb3\u4e50\u662f\u5426\u4e3a\u6211\u559c\u6b22<br \/>\n    bool isHistory; \/\/ \u6807\u8bb0\u2fb3\u4e50\u662f\u5426\u64ad\u653e\u8fc7<br \/>\n    \/\/ \u2fb3\u4e50\u7684\u57fa\u672c\u4fe1\u606f\u6709&#xff1a;\u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u2f3f\u540d\u79f0\u3001\u4e13\u8f91\u540d\u79f0\u3001\u603b\u65f6\u2ed3<br \/>\n    QString musicName;<br \/>\n    QString singerName;<br \/>\n    QString albumName;<br \/>\n    qint64 duration; \/\/ \u2fb3\u4e50\u7684\u6301\u7eed\u65f6\u2ed3&#xff0c;\u5373\u64ad\u653e\u603b\u7684\u65f6\u2ed3<br \/>\n    \/\/ \u4e3a\u4e86\u6807\u8bb0\u6b4c\u66f2\u7684\u552f\u2f00\u6027&#xff0c;\u7ed9\u6b4c\u66f2\u8bbe\u7f6eid<br \/>\n    \/\/ \u78c1\u76d8\u4e0a\u7684\u6b4c\u66f2\u2f42\u4ef6\u7ecf\u5e38\u5220\u9664\u6216\u8005\u4fee\u6539\u4f4d\u7f6e&#xff0c;\u5bfc\u81f4\u64ad\u653e\u65f6\u627e\u4e0d\u5230\u2f42\u4ef6&#xff0c;\u6216\u8005\u91cd\u590d\u6dfb\u52a0<br \/>\n    \/\/ \u6b64\u5904\u2f64musicId\u6765\u7ef4\u62a4\u64ad\u653e\u5217\u8868\u4e2d\u2fb3\u4e50\u7684\u552f\u2f00\u6027<br \/>\n    QString musicId;<br \/>\n    QUrl musicUrl; \/\/ \u2fb3\u4e50\u5728\u78c1\u76d8\u4e2d\u7684\u4f4d\u7f6e<br \/>\n}; <\/p>\n<p>Music.cpp\u65b0\u589e\u00a0<\/p>\n<p>\/\/ music.cpp\u4e2d\u65b0\u589e<br \/>\nMusic::Music()<br \/>\n    : isLike(false)<br \/>\n    , isHistory(false)<br \/>\n{}<br \/>\nvoid Music::setIsLike(bool isLike)<br \/>\n{<br \/>\n    this-&gt;isLike &#061; isLike;<br \/>\n}<br \/>\nvoid Music::setIsHistory(bool isHistory)<br \/>\n{<br \/>\n    this-&gt;isHistory &#061; isHistory;<br \/>\n}<br \/>\nvoid Music::setMusicName(const QString&amp; musicName)<br \/>\n{<br \/>\n    this-&gt;musicName &#061; musicName;<br \/>\n}<br \/>\nvoid Music::setSingerName(const QString&amp; singerName)<br \/>\n{<br \/>\n    this-&gt;singerName &#061; singerName;<br \/>\n}<br \/>\nvoid Music::setAlbumName(const QString&amp; albumName)<br \/>\n{<br \/>\n    this-&gt;albumName &#061; albumName;<br \/>\n}<br \/>\nvoid Music::setDuration(const qint64 duration)<br \/>\n{<br \/>\n    this-&gt;duration &#061; duration;<br \/>\n}<br \/>\nvoid Music::setMusicUrl(const QUrl&amp; url)<br \/>\n{<br \/>\n    this-&gt;musicUrl &#061; url;<br \/>\n}<br \/>\nvoid Music::setMusicId(const QString&amp; musicId)<br \/>\n{<br \/>\n    this-&gt;musicId &#061; musicId;<br \/>\n}<br \/>\nbool Music::getIsLike()<br \/>\n{<br \/>\n    return isLike;<br \/>\n}<br \/>\nbool Music::getIsHistory()<br \/>\n{<br \/>\n    return isHistory;<br \/>\n}<br \/>\nQString Music::getMusicName()<br \/>\n{<br \/>\n    return musicName;<br \/>\n}<br \/>\nQString Music::getSingerName()<br \/>\n{<br \/>\n    return singerName;<br \/>\n}<br \/>\nQString Music::getAlbumName()<br \/>\n{<br \/>\n    return albumName;<br \/>\n}<br \/>\nqint64 Music::getDuration()<br \/>\n{<br \/>\n    return duration;<br \/>\n}<br \/>\nQUrl Music::getMusicUrl()<br \/>\n{<br \/>\n    return musicUrl;<br \/>\n}<br \/>\nQString Music::getMusicId()<br \/>\n{<br \/>\n    return musicId;<br \/>\n} <\/p>\n<p>\u00a0\u53e6\u5916&#xff0c;\u8be5\u7c7b\u8fd8\u9700\u8981\u6dfb\u52a0\u4e00\u4e2a\u5e26\u6709\u6b4c\u66f2\u6587\u4ef6\u8def\u5f84\u7684\u6784\u9020\u51fd\u6570&#xff0c;\u5f53\u7ed9\u5b9a\u6709\u6548\u97f3\u4e50\u6587\u4ef6\u540e&#xff0c;Music\u7c7b\u9700\u8981\u8d1f\u8d23\u5c06\u8be5\u97f3\u4e50\u6587\u4ef6\u7684\u5143\u6570\u636e\u89e3\u6790\u51fa\u6765\u3002\u4e3a\u4e86\u4fdd\u8bc1Music\u5bf9\u8c61\u7684\u552f\u4e00\u6027&#xff0c;\u7ed9\u6bcf\u4e2aMusic\u5bf9\u8c61\u8bbe\u7f6e\u4e00\u4e2aUUID\u3002UUID&#xff0c;\u5373\u901a\u7528\u552f\u4e00\u8bc6\u522b\u7801(Universally UniqueIdentifier)&#xff0c;\u786e\u4fdd\u5728\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d\u6bcf\u4e2a\u5143\u7d20\u90fd\u6709\u552f\u4e00\u7684\u6807\u8bc6\u3002UUID\u7531\u4e00\u7ec432\u4f4d\u6570\u768416\u8fdb\u5236\u6570\u5b57\u7ec4\u6210&#xff0c;\u5f62\u5f0f\u4e3a8-4-4-4-12\u768432\u4e2a\u5b57\u7b26&#xff0c;\u6bd4\u5982&#xff1a;&#034;550e8400-e29b-41d4-a716-446655440000&#034;\u5728Music\u5bf9\u8c61\u67e5\u627e\u548c\u66f4\u65b0\u65f6&#xff0c;\u53ef\u4ee5\u5df2\u901a\u8fc7\u5bf9\u6bd4UUID&#xff0c;\u6765\u4fdd\u8bc1Music\u5bf9\u8c61\u7684\u552f\u4e00\u6027\u3002Qt\u4e2dQUuid\u7c7b\u53ef\u751f\u6210UUID\u3002<\/p>\n<p> Music::Music(const QUrl&amp; url)<br \/>\n    : isLike(false)<br \/>\n    , isHistory(false)<br \/>\n    , musicUrl(url)<br \/>\n{<br \/>\n    musicId &#061; QUuid::createUuid().toString();<br \/>\n} <\/p>\n<h3>\u00a02\u3001\u89e3\u6790\u97f3\u4e50\u6587\u4ef6\u6e90\u6570\u636e<\/h3>\n<p>\u5bf9\u4e8e\u6bcf\u9996\u6b4c\u66f2&#xff0c;\u5c06\u6765\u5728\u754c\u9762\u4e0a\u9700\u8981\u663e\u793a\u51fa&#xff1a;\u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u624b\u3001\u4e13\u8f91\u540d\u79f0&#xff0c;\u5728\u64ad\u653e\u65f6\u8fd8\u9700\u8981\u62ff\u5230\u6b4c\u66f2\u603b\u65f6\u957f&#xff0c;\u56e0\u6b64\u5728\u6784\u9020\u97f3\u4e50\u5bf9\u8c61\u65f6&#xff0c;\u5c31\u9700\u8981\u5c06\u4e0a\u8ff0\u4fe1\u606f\u89e3\u6790\u51fa\u6765\u3002\u6b4c\u66f2\u5143\u6570\u636e\u89e3\u6790&#xff0c;\u9700\u8981\u7528\u5230QMediaPlayer&#xff0c;\u8be5\u7c7b\u4e5f\u662f\u7528\u6765\u8fdb\u884c\u6b4c\u66f2\u64ad\u653e\u7684\u7c7b\u3002<\/p>\n<p>\/\/QMediaPlayer\u7c7b\u4e2d\u7684setMedia()\u51fd\u6570 \/\/ \u529f\u80fd&#xff1a;\u8bbe\u7f6e\u8981\u64ad\u653e\u7684\u5a92\u4f53\u6e90&#xff0c;\u5a92\u4f53\u6570\u636e\u4ece\u4e2d\u8bfb\u53d6 \/\/ media: \u8981\u64ad\u653e\u7684\u5a92\u4f53\u5185\u5bb9&#xff0c;\u2f50\u5982\u2f00\u4e2a\u89c6\u9891\u6216\u2fb3\u9891\u2f42\u4ef6&#xff0c;\u8be5\u7c7b\u63d0\u4f9b\u4e86\u2f00\u4e2aQUrl\u683c\u5f0f\u7684\u5355\u53c2\u6784\u9020 void setMedia(const QMediaContent&amp; media, QIODevice* stream &#061; nullptr) \/\/\u6ce8\u610f&#xff1a;\u8be5\u51fd\u6570\u6267\u2f8f\u540e\u2f74\u5373\u8fd4\u56de&#xff0c;\u4e0d\u4f1a\u7b49\u5f85\u5a92\u4f53\u52a0\u8f7d\u5b8c\u6210&#xff0c;\u4e5f\u4e0d\u68c0\u67e5\u9519\u8bef&#xff0c;\u5982\u679c\u5728\u5a92\u4f53\u52a0\u8f7d\u65f6\u53d1\u2f63\u9519 \/\/\u8bef&#xff0c;\u4f1a\u89e6\u53d1mediaStatusChanged\u548cerror\u4fe1\u53f7<\/p>\n<p>\/\/ \u68c0\u6d4b\u5a92\u4f53\u6e90\u662f\u5426\u6709\u6548&#xff0c;\u5982\u679c\u662f\u6709\u6548\u7684\u8fd4\u56detrue&#xff0c;\u5426\u5219\u8fd4\u56defalse bool isMetaDataAvailable() const;<\/p>\n<p>\/\/\u5a92\u4f53\u5143\u6570\u636e\u52a0\u8f7d\u6210\u529f\u4e4b\u540e&#xff0c;\u53ef\u4ee5\u901a\u8fc7QMediaObject\u7c7b\u7684metaData\u51fd\u6570\u83b7\u53d6\u6307\u5b9a\u7684\u5a92\u4f53\u6570\u636e&#xff1a; \/\/ \u8fd4\u56de\u8981\u83b7\u53d6\u7684\u5a92\u4f53\u6570\u636ekey\u7684\u503c QVariant QMediaObject::metaData(const QString&amp; key) const&#xff1b;<\/p>\n<p>\u8be5\u9879\u76ee\u4e2d\u9700\u8981\u83b7\u53d6\u5a92\u4f53\u7684\u6807\u9898\u3001\u4f5c\u8005\u3001\u4e13\u8f91\u3001\u6301\u7eed\u65f6\u957f\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"175\" src=\"2025-04-29cubl1np3jel.png\" width=\"340\" \/><\/p>\n<p>\u97f3\u4e50\u6587\u4ef6\u7684mate\u6570\u636e\u89e3\u6790\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p>\/\/ music.h \u4e2d\u65b0\u589e<br \/>\nprivate:<br \/>\n void parseMediaMetaData();<br \/>\n\/\/ music.cpp \u4e2d\u65b0\u589e<br \/>\n#include &lt;QMediaPlayer&gt;<br \/>\n#include &lt;QCoreApplication&gt;<br \/>\n#include &lt;QUuid&gt;<br \/>\nvoid Music::parseMediaMetaData()<br \/>\n{<br \/>\n    \/\/ \u89e3\u6790\u65f6\u5019\u9700\u8981\u8bfb\u53d6\u6b4c\u66f2\u6570\u636e&#xff0c;\u8bfb\u53d6\u6b4c\u66f2\u2f42\u4ef6\u9700\u8981\u2f64\u5230QMediaPlayer\u7c7b<br \/>\n    QMediaPlayer player;<br \/>\n    player.setMedia(musicUrl);<br \/>\n    \/\/ \u5a92\u4f53\u5143\u6570\u636e\u89e3\u6790\u9700\u8981\u65f6\u95f4&#xff0c;\u53ea\u6709\u7b49\u5f85\u89e3\u6790\u5b8c\u6210\u4e4b\u540e&#xff0c;\u624d\u80fd\u63d0\u53d6\u2fb3\u4e50\u4fe1\u606f&#xff0c;\u6b64\u5904\u5faa\u73af\u7b49\u5f85<br \/>\n    \/\/ \u5faa\u73af\u7b49\u5f85\u65f6&#xff1a;\u4e3b\u754c\u2faf\u6d88\u606f\u5faa\u73af\u5c31\u2f46\u6cd5\u5904\u7406\u4e86&#xff0c;\u56e0\u6b64\u9700\u8981\u5728\u7b49\u5f85\u89e3\u6790\u671f\u95f4&#xff0c;\u8ba9\u6d88\u606f\u5faa\u73af\u7ee7\u7eed\u5904\u7406<br \/>\n    while (!player.isMetaDataAvailable())<br \/>\n    {<br \/>\n        QCoreApplication::processEvents();<br \/>\n    }<br \/>\n    \/\/ \u89e3\u6790\u5a92\u4f53\u5143\u6570\u636e\u7ed3\u675f&#xff0c;\u63d0\u53d6\u5143\u6570\u636e\u4fe1\u606f<br \/>\n    if (player.isMetaDataAvailable())<br \/>\n    {<br \/>\n        musicName &#061; player.metaData(&#034;Title&#034;).toString();<br \/>\n        singerName &#061; player.metaData(&#034;Author&#034;).toString();<br \/>\n        albumName &#061; player.metaData(&#034;AlbumTitle&#034;).toString();<br \/>\n        duration &#061; player.duration();<br \/>\n        if (musicName.isEmpty())<br \/>\n        {<br \/>\n            musicName &#061; &#034;\u6b4c\u66f2\u672a\u77e5&#034;;<br \/>\n        }<br \/>\n        if (singerName.isEmpty())<br \/>\n        {<br \/>\n            singerName &#061; &#034;\u6b4c\u2f3f\u672a\u77e5&#034;;<br \/>\n        }<br \/>\n        if (albumName.isEmpty())<br \/>\n        {<br \/>\n            albumName &#061; &#034;\u4e13\u8f91\u540d\u672a\u77e5&#034;;<br \/>\n        }<br \/>\n        qDebug() &lt;&lt; musicName &lt;&lt; &#034; &#034; &lt;&lt; singerName &lt;&lt; &#034; &#034; &lt;&lt; albumName &lt;&lt; &#034; &#034; &lt;&lt; duration;<br \/>\n    }<br \/>\n}<br \/>\n\/\/ \u8be5\u51fd\u6570\u9700\u8981\u5728Music\u7684\u6784\u9020\u51fd\u6570\u4e2d\u8c03\u2f64&#xff0c;\u5f53\u521b\u5efa\u2fb3\u4e50\u5bf9\u8c61\u65f6&#xff0c;\u987a\u4fbf\u5b8c\u6210\u6b4c\u66f2\u2f42\u4ef6\u7684\u52a0\u8f7d<br \/>\nMusic::Music(const QUrl&amp; url)<br \/>\n    : isLike(false)<br \/>\n    , isHistory(false)<br \/>\n    , musicUrl(url)<br \/>\n{<br \/>\n    musicId &#061; QUuid::createUuid().toString();<br \/>\n    parseMediaMetaData();<br \/>\n} <\/p>\n<h3>\u00a03\u3001Music\u6570\u636e\u4fdd\u5b58<\/h3>\n<p>\u901a\u8fc7QFileDialog\u5c06\u97f3\u4e50\u4ece\u672c\u5730\u78c1\u76d8\u52a0\u8f7d\u5230\u7a0b\u5e8f\u4e2d\u540e&#xff0c;\u62ff\u5230\u7684\u662f\u6240\u6709\u97f3\u4e50\u6587\u4ef6\u7684QUrl&#xff0c;\u800c\u5728\u7a0b\u5e8f\u4e2d\u9700\u8981\u7684\u662f\u7ecf\u8fc7\u5143\u6570\u636e\u89e3\u6790\u4e4b\u540e\u7684Music\u5bf9\u8c61&#xff0c;\u5e76\u4e14Music\u5bf9\u8c61\u9700\u8981\u7ba1\u7406\u8d77\u6765&#xff0c;\u6b64\u65f6\u5c31\u53ef\u4ee5\u91c7\u7528MusicList\u7c7b\u5bf9\u89e3\u6790\u4e4b\u540e\u7684Music\u5bf9\u8c61\u8fdb\u884c\u7ba1\u7406&#xff0c;QQMusic\u7c7b\u4e2d\u53ea\u9700\u8981\u4fdd\u5b58MusicList\u7684\u5bf9\u8c61&#xff0c;\u5c31\u53ef\u4ee5\u8ba9qqMusic.ui\u754c\u9762\u4e2dCommonPage\u5bf9\u8c61\u5b8c\u6210Music\u4fe1\u606f\u5f80\u754c\u9762\u66f4\u65b0\u3002<\/p>\n<p>\/\/ qqmusic.h \u65b0\u589e<br \/>\n#include &#034;musiclist.h&#034;<br \/>\nMusicList musicList;<br \/>\n\/\/ qqmusic.cpp<br \/>\nvoid QQMusic::on_addLocal_clicked()<br \/>\n{<br \/>\n    \/\/ &#8230;.<br \/>\n    \/\/ 6. \u663e\u2f70\u5bf9\u8bdd\u6846&#xff0c;\u5e76\u63a5\u6536\u8fd4\u56de\u503c<br \/>\n    \/\/ \u6a21\u6001\u5bf9\u8bdd\u6846, exec\u5185\u90e8\u662f\u6b7b\u5faa\u73af\u5904\u7406<br \/>\n    if (fileDialog.exec() &#061;&#061; QFileDialog::Accepted)<br \/>\n    {<br \/>\n        \/\/ \u5207\u6362\u5230\u672c\u5730\u2fb3\u4e50\u754c\u2faf&#xff0c;\u56e0\u4e3a\u52a0\u8f7d\u5b8c\u7684\u2fb3\u4e50\u9700\u8981\u5728\u672c\u5730\u2fb3\u4e50\u754c\u2faf\u663e\u2f70<br \/>\n        ui-&gt;stackedWidget-&gt;setCurrentIndex(4);<br \/>\n        \/\/ \u83b7\u53d6\u5bf9\u8bdd\u6846\u7684\u8fd4\u56de\u503c<br \/>\n        QList&lt;QUrl&gt; urls &#061; fileDialog.selectedUrls();<\/p>\n<p>        \/\/ \u62ff\u5230\u6b4c\u66f2\u2f42\u4ef6\u540e&#xff0c;\u5c06\u6b4c\u66f2\u2f42\u4ef6\u4ea4\u7531musicList\u8fdb\u2f8f\u7ba1\u7406<br \/>\n        musicList.addMusicByUrl(urls);<br \/>\n        \/\/ \u66f4\u65b0\u5230\u672c\u5730\u2fb3\u4e50\u5217\u8868<br \/>\n        ui-&gt;localPage-&gt;reFresh(musicList);<br \/>\n    }<br \/>\n} <\/p>\n<h3>4\u3001\u97f3\u4e50\u5206\u7c7b<\/h3>\n<p>QQMusic\u4e2d&#xff0c;\u6709\u4e09\u4e2a\u663e\u793a\u6b4c\u66f2\u4fe1\u606f\u7684\u9875\u9762&#xff1a; likePage&#xff1a;\u7ba1\u7406\u548c\u663e\u793a\u70b9\u51fb\u5c0fv\u5fc3\u5fc3\u540e\u6536\u85cf\u7684\u6b4c\u66f2 localPage&#xff1a;\u7ba1\u7406\u548c\u663e\u793a\u672c\u5730\u52a0\u8f7d\u7684\u6b4c\u66f2 recentPage&#xff1a;\u7ba1\u7406\u548c\u663e\u793a\u5386\u53f2\u64ad\u653e\u8fc7\u7684\u6b4c\u66f2 \u8fd9\u4e09\u4e2a\u9875\u9762\u7684\u7c7b\u578b\u90fd\u662fCommonPage&#xff0c;\u6bcf\u4e2a\u9875\u9762\u5e94\u8be5\u7ef4\u62a4\u81ea\u5df1\u9875\u9762\u4e2d\u7684\u6b4c\u66f2\u3002\u56e0\u6b64CommonPage\u7c7b\u4e2d\u9700\u8981\u65b0\u589e&#xff1a;<\/p>\n<p>\/\/ commonpage.h\u4e2d\u65b0\u589e<br \/>\n\/\/ \u533a\u5206\u4e0d\u540cpage\u2eda\u2faf<br \/>\nenum PageType<br \/>\n{<br \/>\n    LIKE_PAGE, \/\/ \u6211\u559c\u6b22\u2eda\u2faf<br \/>\n    LOCAL_PAGE, \/\/ \u672c\u5730\u4e0b\u8f7d\u2eda\u2faf<br \/>\n    HISTORY_PAGE \/\/ \u6700\u8fd1\u64ad\u653e\u2eda\u2faf<br \/>\n};<br \/>\nclass CommonForm : public QWidget<br \/>\n{<br \/>\n    \/\/ \u65b0\u589e\u6210\u5458\u51fd\u6570<br \/>\npublic:<br \/>\n    void setMusicListType(PageType pageType);<br \/>\n    \/\/ \u65b0\u589e\u6210\u5458\u53d8\u91cf<br \/>\nprivate:<br \/>\n    \/\/ \u6b4c\u5355\u5217\u8868<br \/>\n    QVector&lt;QString&gt; musicListOfPage; \/\/ \u5177\u4f53\u67d0\u4e2a\u2eda\u2faf\u7684\u2fb3\u4e50&#xff0c;\u5c06\u6765\u53ea\u9700\u8981\u5b58\u50a8\u2fb3\u4e50\u7684id\u5373\u53ef<br \/>\n    PageType pageType; \/\/ \u6807\u8bb0\u5c5e\u4e8elikePage\u3001localPage\u3001recentPage\u54ea\u4e2a\u2eda\u2faf<br \/>\n};<br \/>\n\/\/ commonpage.cpp\u4e2d\u65b0\u589e&#xff1a;<br \/>\nvoid CommonPage::setMusicListType(PageType pageType)<br \/>\n{<br \/>\n    this-&gt;pageType &#061; pageType;<br \/>\n}<br \/>\n\/\/ qqmusic.cpp\u4e2d\u65b0\u589e&#xff1a;<br \/>\nvoid initUi()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u8bbe\u7f6eCommonPage\u7684\u4fe1\u606f<br \/>\n    ui-&gt;likePage-&gt;setMusicListType(PageType::LIKE_PAGE);<br \/>\n    ui-&gt;likePage-&gt;setCommonPageUI(&#034;\u6211\u559c\u6b22&#034;, &#034;:\/images\/ilikebg.png&#034;);<br \/>\n    ui-&gt;localPage-&gt;setMusicListType(PageType::LOCAL_PAGE);<br \/>\n    ui-&gt;localPage-&gt;setCommonPageUI(&#034;\u672c\u5730\u2fb3\u4e50&#034;, &#034;:\/images\/localbg.png&#034;);<br \/>\n    ui-&gt;recentPage-&gt;setMusicListType(PageType::HISTORY_PAGE);<br \/>\n    ui-&gt;recentPage-&gt;setCommonPageUI(&#034;\u6700\u8fd1\u64ad\u653e&#034;, &#034;:\/images\/recentbg.png&#034;);<br \/>\n} <\/p>\n<p>QQMusic\u4e2d&#xff0c;\u70b9\u51fbaddLocal(\u672c\u5730\u52a0\u8f7d)\u6309\u94ae\u540e&#xff0c;\u4f1a\u901a\u8fc7\u5176musicList\u6210\u5458\u53d8\u91cf&#xff0c;\u5c06music\u6dfb\u52a0\u5230 musicList\u4e2d\u7ba1\u7406&#xff0c;\u5728\u6dfb\u52a0\u8fc7\u7a0b\u4e2d&#xff0c;\u6bcf\u4e2a\u6b4c\u66f2\u4f1a\u5bf9\u5e94\u4e00\u4e2aMusic\u5bf9\u8c61&#xff0c;Music\u5bf9\u8c61\u5728\u6784\u9020\u65f6&#xff0c;\u4f1a\u5b8c\u6210\u6b4c\u66f2\u6587\u4ef6\u7684\u52a0\u8f7d&#xff0c;\u987a\u4fbf\u5b8c\u6210\u6b4c\u66f2\u540d\u79f0\u3001\u4f5c\u8005\u3001\u4e13\u8f91\u540d\u79f0\u7b49\u5143\u6570\u636e\u7684\u89e3\u6790\u3002\u4e00\u5207\u51c6\u5907\u5c31\u7eea\u4e4b\u540e&#xff0c;\u6bcf\u4e2a CommonPage\u9875\u9762&#xff0c;\u901a\u8fc7QQMusic\u7684musicList\u5206\u79bb\u51fa\u81ea\u5df1\u9875\u9762\u7684\u6b4c\u66f2&#xff0c;\u4fdd\u5b58\u5728musicListOfPage \u4e2d\u3002<\/p>\n<p>\/\/ commonpage.h\u4e2d\u65b0\u589e&#xff1a;<br \/>\n#include &#034;musiclist.h&#034;<br \/>\nprivate:<br \/>\n    void addMusicToMusicPage(MusicList&amp; musicList);<\/p>\n<p>    \/\/ commonpage.cpp \u4e2d\u65b0\u589e&#xff1a;<br \/>\n    void CommonPage::addMusicToMusicPage(MusicList&amp; musicList)<br \/>\n    {<br \/>\n        \/\/ \u5c06\u65e7\u5185\u5bb9\u6e05\u7a7a<br \/>\n        musicListOfPage.clear();<br \/>\n        for (auto&amp; music : musicList)<br \/>\n        {<br \/>\n            switch (musicListType)<br \/>\n            {<br \/>\n            case LOCAL_LIST:<br \/>\n                musicListOfPage.push_back(music.getMusicId());<br \/>\n                break;<br \/>\n            case LIKE_LIST:<br \/>\n            {<br \/>\n                if (music.getIsLike())<br \/>\n                {<br \/>\n                    musicListOfPage.push_back(music.getMusicId());<br \/>\n                }<br \/>\n                break;<br \/>\n            }<br \/>\n            case HOSTORY_LIST:<br \/>\n            {<br \/>\n                if (music.getIsHistory())<br \/>\n                {<br \/>\n                    musicListOfPage.push_back(music.getMusicId());<br \/>\n                    break;<br \/>\n                }<br \/>\n            }<br \/>\n            default:<br \/>\n                break;<br \/>\n            }<br \/>\n        }<br \/>\n    } <\/p>\n<p>\u7531\u4e8emusicList\u6240\u5c5e\u7c7b&#xff0c;\u5e76\u4e0d\u80fd\u76f4\u63a5\u652f\u6301\u8303\u56f4for&#xff0c;\u56e0\u6b64\u9700\u8981\u5728MusicList\u7c7b\u4e2d\u65b0\u589e&#xff1a;<\/p>\n<p>\/\/ musiclist.h\u4e2d\u65b0\u589e&#xff1a;<br \/>\ntypedef typename QVector&lt;Music&gt;::iterator iterator;<br \/>\niterator begin();<br \/>\niterator end();<br \/>\n\/\/ musiclist.cpp\u4e2d\u65b0\u589e&#xff1a;<br \/>\niterator MusicList::begin()<br \/>\n{<br \/>\n    return musicList.begin();<br \/>\n}<br \/>\niterator MusicList::end()<br \/>\n{<br \/>\n    return musicList.end();<br \/>\n} <\/p>\n<h3>5\u3001\u66f4\u65b0Muic\u5bf9\u8c61\u5230CommonPage\u9875\u9762<\/h3>\n<p>\u6b65\u9aa4&#xff1a; 1. \u8c03\u7528addMusicldPageFromMusicList\u51fd\u6570&#xff0c;\u4ecemusicList\u4e2d\u6dfb\u52a0\u5f53\u524d\u9875\u9762\u7684\u6b4c\u66f2 2.\u904d\u5386musicListOfPage&#xff0c;\u62ff\u5230\u6bcf\u9996\u97f3\u4e50\u540e\u5148\u68c0\u67e5\u5176\u662f\u5426\u5728&#xff0c;\u5b58\u5728\u5219\u6dfb\u52a0\u3002 3.\u754c\u9762\u4e0a\u9700\u8981\u66f4\u65b0\u6bcf\u9996\u6b4c\u66f2\u7684&#xff1a;\u6b4c\u66f2\u540d\u79f0\u3001\u4f5c\u8005\u3001\u4e13\u8f91\u540d\u79f0&#xff0c;\u800ccommonPage\u4e2d\u53ea\u4fdd\u5b58\u4e86\u6b4c\u66f2\u7684musicld&#xff0c;\u56e0\u6b64\u9700\u8981\u5728MusicList\u4e2d\u589e\u52a0\u901a\u8fc7musicID\u67e5\u627eMusic\u5bf9\u8c61\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\/\/ commonpage.h\u4e2d\u65b0\u589e<br \/>\nvoid reFresh(MusicList&amp; musicList);<br \/>\n\/\/ commonpage.cpp \u4e2d\u65b0\u589e&#xff1a;<br \/>\nvoid CommonPage::reFresh(MusicList&amp; musicList)<br \/>\n{<br \/>\n    \/\/ \u4ecemusicList\u4e2d\u5206\u79bb\u51fa\u5f53\u524d\u2eda\u2faf\u7684\u6240\u6709\u2fb3\u4e50<br \/>\n    addMusicIdPageFromMusicList(musicList);<br \/>\n    \/\/ \u904d\u5386\u6b4c\u5355&#xff0c;\u5c06\u6b4c\u5355\u4e2d\u7684\u6b4c\u66f2\u663e\u2f70\u5230\u754c\u2faf<br \/>\n    for (auto musicId : musicListOfPage)<br \/>\n    {<br \/>\n        auto it &#061; musicList.findMusicById(musicId);<br \/>\n        if (it &#061;&#061; musicList.end())<br \/>\n            continue;<br \/>\n        ListItemBox* listItemBox &#061; new ListItemBox(ui-&gt;pageMusicList);<br \/>\n        listItemBox-&gt;setMusicName(it-&gt;getMusicName());<br \/>\n        listItemBox-&gt;setSinger(it-&gt;getSingerName());<br \/>\n        listItemBox-&gt;setAlbumName(it-&gt;getAlbumName());<br \/>\n        listItemBox-&gt;setLikeIcon(it-&gt;getIsLike());<br \/>\n        QListWidgetItem* listWidgetItem &#061; new QListWidgetItem(ui -&gt; pageMusicList);<br \/>\n        listWidgetItem-&gt;setSizeHint(QSize(ui-&gt;pageMusicList-&gt;width(), 45));<br \/>\n        ui-&gt;pageMusicList-&gt;setItemWidget(listWidgetItem, listItemBox);<br \/>\n    }<br \/>\n    \/\/ \u66f4\u65b0\u5b8c\u6210\u540e\u5237\u65b0\u4e0b\u754c\u2faf<br \/>\n    repaint();<br \/>\n}<br \/>\n\/\/ musiclist.h\u4e2d\u65b0\u589e<br \/>\niterator findMusicById(const QString&amp; musicId);<br \/>\n\/\/ musiclist.cpp\u4e2d\u65b0\u589e<br \/>\niterator MusicList::findMusicById(const QString&amp; musicId)<br \/>\n{<br \/>\n    for (iterator it &#061; begin(); it !&#061; end(); &#043;&#043;it)<br \/>\n    {<br \/>\n        if (it-&gt;getMusicId() &#061;&#061; musicId)<br \/>\n        {<br \/>\n            return it;<br \/>\n        }<br \/>\n    }<br \/>\n    return end();<br \/>\n} <\/p>\n<p>\u00a0\u5c06\u6b4c\u66f2\u540d\u79f0\u3001\u4f5c\u8005\u3001\u4e13\u8f91\u540d\u79f0\u3001\u559c\u6b22\u56fe\u7247\u7b49\u5f80ListBoxItem\u754c\u9762\u4e2d\u66f4\u65b0\u65f6&#xff0c;\u9700\u8981ListBoxItem\u63d0\u4f9b\u5bf9\u5e94\u7684set\u65b9\u6cd5&#xff0c;\u56e0\u6b64\u9700\u8981\u5728ListltemBox\u7c7b\u4e2d\u65b0\u589e&#xff1a;<\/p>\n<p>\/\/ listitembox.h\u4e2d\u65b0\u589e&#xff1a;<br \/>\npublic:<br \/>\n    void setMusicName(const QString&amp; name);<br \/>\n    void setSinger(const QString&amp; singer);<br \/>\n    void setAlbumName(const QString&amp; albumName);<br \/>\n    void setLikeIcon(bool like);<\/p>\n<p>private:<br \/>\n    bool isLike;<\/p>\n<p>    \/\/ listitembox.cpp\u4e2d\u65b0\u589e&#xff1a;<br \/>\n    ListItemBox::ListItemBox(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::ListItemBox),<br \/>\n        isLike(false) \/\/ \u9ed8\u8ba4\u8bbe\u7f6e\u4e3afalse&#xff0c;\u2fb3\u4e50\u52a0\u8f7d\u4e0a\u6765\u4e4b\u540e&#xff0c;\u70b9\u51fb\u4e86\u2f29\u2f3c \u624d\u4e3atrue<br \/>\n    {<br \/>\n        ui-&gt;setupUi(this);<br \/>\n    }<br \/>\n    void ListItemBox::setMusicName(const QString&amp; name)<br \/>\n    {<br \/>\n        ui-&gt;musicNameLabel-&gt;setText(name);<br \/>\n    }<br \/>\n    void ListItemBox::setSinger(const QString&amp; singer)<br \/>\n    {<br \/>\n        ui-&gt;musicSingerLabel-&gt;setText(singer);<br \/>\n    }<br \/>\n    void ListItemBox::setAlbumName(const QString&amp; albumName)<br \/>\n    {<br \/>\n        ui-&gt;musicAlbumLabel-&gt;setText(albumName);<br \/>\n    }<br \/>\n    void ListItemBox::setLikeIcon(bool like)<br \/>\n    {<br \/>\n        isLike &#061; like;<br \/>\n        if (isLike)<br \/>\n        {<br \/>\n            ui-&gt;likeBtn-&gt;setIcon(QIcon(&#034;:\/images\/like_2.png&#034;));<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            ui-&gt;likeBtn-&gt;setIcon(QIcon(&#034;:\/images\/like_3.png&#034;));<br \/>\n        }<br \/>\n    } <\/p>\n<p>\u66f4\u65b0\u97f3\u4e50\u4fe1\u606f\u5230\u754c\u9762\u7684\u51fd\u6570\u5904\u7406\u5b8c\u6210\u4e4b\u540e&#xff0c;\u9700\u8981\u5728QQMusic\u7684addLocal\u69fd\u51fd\u6570\u6700\u540e\u8c03\u7528\u3002<\/p>\n<p>\/\/ qqmusic.cpp\u4e2d\u65b0\u589e&#xff1a;<br \/>\nvoid QQMusic::onAddLocalClick()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ 6. \u663e\u2f70\u5bf9\u8bdd\u6846&#xff0c;\u5e76\u63a5\u6536\u8fd4\u56de\u503c<br \/>\n    \/\/ \u6a21\u6001\u5bf9\u8bdd\u6846, exec\u5185\u90e8\u662f\u6b7b\u5faa\u73af\u5904\u7406<br \/>\n    if (fileDialog.exec() &#061;&#061; QFileDialog::Accepted)<br \/>\n    {<br \/>\n        \/\/ \u5207\u6362\u5230\u672c\u5730\u2fb3\u4e50\u754c\u2faf&#xff0c;\u56e0\u4e3a\u52a0\u8f7d\u5b8c\u7684\u2fb3\u4e50\u9700\u8981\u5728\u672c\u5730\u2fb3\u4e50\u754c\u2faf\u663e\u2f70<br \/>\n        ui-&gt;stackedWidget-&gt;setCurrentIndex(4);<br \/>\n        \/\/ \u83b7\u53d6\u5bf9\u8bdd\u6846\u7684\u8fd4\u56de\u503c<br \/>\n        QList&lt;QUrl&gt; urls &#061; fileDialog.selectedUrls();<br \/>\n        \/\/ \u6ce8\u610f&#xff1a;\u540e\u5e8f\u9700\u8981\u5c06\u2fb3\u4e50\u4fe1\u606f\u6dfb\u52a0\u5230\u6570\u636e\u5e93&#xff0c;\u5426\u5219\u6bcf\u6b21\u6253\u5f00\u662f\u90fd\u9700\u8981\u6dfb\u52a0\u2fb3\u4e50\u592a\u2fc7\u70e6\u4e86<br \/>\n        musicList.addMusicByUrl(urls);<br \/>\n        \/\/ \u66f4\u65b0\u5230\u672c\u5730\u2fb3\u4e50\u5217\u8868<br \/>\n        ui-&gt;localPage-&gt;reFresh(musicList);<br \/>\n    }<br \/>\n} <\/p>\n<h2>\u97f3\u4e50\u6536\u85cf&#xff08;\u70b9\u51fb\u5c0f\u5fc3\u5fc3&#xff09;<\/h2>\n<h3>1\u3001\u6536\u85cf\u56fe\u6807\u5904\u7406<\/h3>\n<p>\u5f53CommonPage\u5f80\u754c\u9762\u66f4\u65b0Music\u4fe1\u606f\u65f6&#xff0c;\u4e5f\u8981\u6839\u636eMusic\u7684isLike\u5c5e\u6027\u66f4\u65b0\u5bf9\u5e94\u7684\u56fe\u6807\u3002\u56e0\u6b64 ListItemBox\u9700\u8981\u6839\u636e\u5f53\u70b9\u51fb\u6211\u559c\u6b22\u6309\u94ae\u4e4b\u540e&#xff0c;\u8981\u5207\u6362ListItemBox\u4e2d\u7684\u5c0f\u5fc3\u5fc3\u3002\u56e0\u6b64ListItemBox\u4e2d\u6dfb\u52a0\u8bbe\u7f6ebool\u7c7b\u578bisLike\u6210\u5458\u53d8\u91cf&#xff0c;\u4ee5\u53casetIsLike\u51fd\u6570&#xff0c;\u5728CommonPage\u6dfb\u52a0Music\u4fe1\u606f\u5230\u754c\u9762\u65f6&#xff0c;\u8981\u80fd\u591f\u8bbe\u7f6e\u5c0f\u5fc3\u5fc3\u56fe\u7247\u3002<\/p>\n<p>\/\/ listItemBox.h \u4e2d\u65b0\u589e<br \/>\nbool isLike;<br \/>\nvoid setLikeMusic(bool isLike);<br \/>\n\/\/ listItemBox.cp \u4e2d\u65b0\u589e<br \/>\nListItemBox::ListItemBox(QWidget* parent) :<br \/>\n    QWidget(parent),<br \/>\n    ui(new Ui::ListItemBox),<br \/>\n    isLike(false)<br \/>\n{<br \/>\n    ui-&gt;setupUi(this);<br \/>\n}<br \/>\nvoid ListItemBox::setLikeMusic(bool isLike)<br \/>\n{<br \/>\n    this-&gt;isLike &#061; isLike;<br \/>\n    if (isLike)<br \/>\n    {<br \/>\n        ui-&gt;likeBtn-&gt;setIcon(QIcon(&#034;:\/images\/like_2.png&#034;));<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        ui-&gt;likeBtn-&gt;setIcon(QIcon(&#034;:\/images\/like_3.png&#034;));<br \/>\n    }<br \/>\n} <\/p>\n<h3>2\u3001\u70b9\u51fb\u6536\u85cf\u6309\u94ae\u5904\u7406<\/h3>\n<p>\u5f53\u559c\u6b22\u67d0\u9996\u6b4c\u66f2\u65f6&#xff0c;\u53ef\u4ee5\u70b9\u51fb\u754c\u9762\u4e0a\u7ea2\u8272\u5c0f\u5fc3\u5fc3\u6536\u85cf\u8be5\u9996\u6b4c\u66f2\u3002\u6211\u559c\u6b22\u6309\u94ae\u4e2d\u5e94\u8be5\u6709\u4ee5\u4e0b\u64cd\u4f5c&#xff1a; 1.\u66f4\u65b0\u5c0f\u5fc3\u5fc3\u56fe\u6807 2.\u66f4\u65b0Music\u7684\u6211\u559c\u6b22\u5c5e\u6027&#xff0c;\u4f46ListItemBox\u5e76\u6ca1\u6709\u6b4c\u66f2\u6570\u636e&#xff0c;\u6240\u4ee5\u53ea\u80fd\u53d1\u5c04\u4fe1\u53f7&#xff0c;\u8ba9\u5176\u7236\u5143\u7d20 CommonPage\u6765\u5904\u7406<\/p>\n<p>\/\/ listItemBox.h \u4e2d\u65b0\u589e<br \/>\npublic:<br \/>\n    void onLikeBtnClicked(); \/\/ \u6309\u94ae\u70b9\u51fb\u69fd\u51fd\u6570<\/p>\n<p>signals:<br \/>\n    void setIsLike(bool); \/\/ \u901a\u77e5\u66f4\u65b0\u6b4c\u66f2\u6570\u636e\u4fe1\u53f7<\/p>\n<p>    \/\/ ListItemBox.cpp \u4e2d\u65b0\u589e<br \/>\n    ListItemBox::ListItemBox(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::ListItemBox),<br \/>\n        isLike(false)<br \/>\n    {<br \/>\n        ui-&gt;setupUi(this);<\/p>\n<p>        \/\/ likeBtn\u6309\u94ae\u8fde\u63a5\u5176\u70b9\u51fb\u69fd\u51fd\u6570<br \/>\n        connect(ui-&gt;likeBtn, &amp;QPushButton::clicked, this,&amp;ListItemBox::onLikeBtnClicked);<br \/>\n    }<br \/>\n    void ListItemBox::onLikeBtnClicked()<br \/>\n    {<br \/>\n        isLike &#061; !isLike;<br \/>\n        setIsLike(isLike);<br \/>\n        emit setIsLike(isLike);<br \/>\n    } <\/p>\n<p>3.CommonPage\u5728\u5f80QListWidget\u4e2d\u6dfb\u52a0\u5143\u7d20\u65f6&#xff0c;\u4f1a\u521b\u5efa\u4e00\u4e2a\u4e2aListItemBox\u5bf9\u8c61&#xff0c;\u6bcf\u4e2a\u5bf9\u8c61\u5c06\u6765\u90fd \u53ef\u80fd\u4f1a\u53d1\u5c04setLikeMusic\u4fe1\u53f7&#xff0c;\u56e0\u6b64\u5728\u5c06ListItemBox\u6dfb\u52a0\u5b8c\u4e4b\u540e&#xff0c;CommonPage\u5e94\u8be5\u5173\u8054\u5148\u8be5\u4fe1 \u53f7&#xff0c;\u5c06\u9700\u8981\u66f4\u65b0\u7684\u7684Music\u4fe1\u606f\u4ee5\u53ca\u662f\u5426\u559c\u6b22&#xff0c;\u540c\u6b65\u7ed9QQMusiC\u3002<\/p>\n<p>\/\/ commonpage.h\u4e2d\u65b0\u589e<br \/>\nsignals:<br \/>\n    void updateLikeMusic(bool isLike, QString musicId);<\/p>\n<p>    \/\/ commonpage.cpp\u4e2d\u65b0\u589e<br \/>\n    \/\/ \u8be5\u2f45\u6cd5\u8d1f\u8d23\u5c06\u6b4c\u66f2\u4fe1\u606f\u66f4\u65b0\u5230\u754c\u2faf<br \/>\n    void CommonPage::reFresh(MusicList&amp; musicList)<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        for (auto musicId : musicOfPage)<br \/>\n        {<br \/>\n            \/\/ &#8230;<br \/>\n            QListWidgetItem* item &#061; new QListWidgetItem(ui-&gt;pageMusicList);<br \/>\n            item-&gt;setSizeHint(QSize(listItemBox-&gt;width(), listItemBox-&gt;height()));<br \/>\n            ui-&gt;pageMusicList-&gt;setItemWidget(item, listItemBox);<\/p>\n<p>            \/\/ \u63a5\u6536ListItemBox\u53d1\u5c04\u7684setLikeMusic\u4fe1\u53f7<br \/>\n            connect(listItemBox, &amp;ListItemBox::setIsLike, this, [&#061;](bool isLike) {<br \/>\n                emit updateLikeMusic(isLike, it-&gt;getMusicId());<br \/>\n                });<br \/>\n        }<br \/>\n        ui-&gt;pageMusicList-&gt;repaint();<br \/>\n    } <\/p>\n<p>QQMusic\u6536\u5230CommonPage\u53d1\u5c04\u7684updateLikePage\u4fe1\u53f7\u540e&#xff0c;\u901a\u77e5\u5176\u4e0a\u7684likePage\u3001localPage\u3001 recentPage\u66f4\u65b0\u5176\u754c\u9762\u7684\u6211\u559c\u6b22\u6b4c\u66f2\u4fe1\u606f\u3002<\/p>\n<p>\/\/ qqmusic.h \u65b0\u589e<br \/>\nvoid onUpdateLikeMusic(bool isLike, QString musicId); \/\/ \u54cd\u5e94CommonPage\u53d1\u5c04updateLikeMusic\u4fe1\u53f7<br \/>\n\/\/ qqmusic.cpp\u65b0\u589e<br \/>\nvoid QQMusic::connectSignalAndSlots()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u5173\u8054CommonPage\u53d1\u5c04\u7684updateLikeMusic\u4fe1\u53f7<br \/>\n    connect(ui-&gt;likePage, &amp;CommonPage::updateLikeMusic, this,<br \/>\n        &amp;QQMusic::onUpdateLikeMusic);<br \/>\n    connect(ui-&gt;localPage, &amp;CommonPage::updateLikeMusic, this,<br \/>\n        &amp;QQMusic::onUpdateLikeMusic);<br \/>\n    connect(ui-&gt;recentPage, &amp;CommonPage::updateLikeMusic, this,<br \/>\n        &amp;QQMusic::onUpdateLikeMusic);<br \/>\n}<br \/>\nvoid QQMusic::onUpdateLikeMusic(bool isLike, QString musicId)<br \/>\n{<br \/>\n    \/\/ 1. \u627e\u5230\u8be5\u2fb8\u6b4c\u66f2&#xff0c;\u5e76\u66f4\u65b0\u5bf9\u5e94Music\u5bf9\u8c61\u4fe1\u606f<br \/>\n    auto it &#061; musicList.findMusicByMusicId(musicId);<br \/>\n    if (it !&#061; musicList.end())<br \/>\n    {<br \/>\n        it-&gt;setIsLike(isLike);<br \/>\n    }<br \/>\n    \/\/ 2. \u901a\u77e5\u4e09\u4e2a\u2eda\u2faf\u66f4\u65b0\u2f83\u2f30\u7684\u6570\u636e<br \/>\n    ui-&gt;likePage-&gt;reFresh(musicList);<br \/>\n    ui-&gt;localPage-&gt;reFresh(musicList);<br \/>\n    ui-&gt;recentPage-&gt;reFresh(musicList);<br \/>\n} <\/p>\n<h3>3\u3001\u6b4c\u66f2\u91cd\u590d\u663e\u793a\u95ee\u9898<\/h3>\n<p>\/\/ commonpage.cpp\u4fee\u6539<br \/>\nvoid CommonPage::addMusicToMusicPage(MusicList&amp; musicList)<br \/>\n{<br \/>\n    musicOfPage.clear();<\/p>\n<p>    \/\/ &#8230;<br \/>\n}<br \/>\nvoid CommonPage::reFresh(MusicList&amp; musicList)<br \/>\n{<br \/>\n    ui-&gt;pageMusicList-&gt;clear();<br \/>\n    \/\/&#8230;<br \/>\n} <\/p>\n<h2>\u97f3\u4e50\u64ad\u653e\u63a7\u5236<\/h2>\n<h3>1\u3001\u64ad\u653e\u5a92\u4f53\u548c\u64ad\u653e\u5217\u8868\u521d\u59cb\u5316<\/h3>\n<p>#include &lt;QMediaPlayer&gt;<br \/>\n#include &lt;QMediaPlaylist&gt;<br \/>\n\/\/ qqmusic.h \u65b0\u589e<br \/>\npublic:<br \/>\n    void initPlayer(); \/\/ \u521d\u59cb\u5316\u5a92\u4f53\u5bf9\u8c61<br \/>\nprivate:<br \/>\n    \/\/\u64ad\u653e\u5668\u76f8\u5173<br \/>\n    QMediaPlayer* player;<br \/>\n    \/\/ \u8981\u591a\u2fb8\u6b4c\u66f2\u64ad\u653e&#xff0c;\u4ee5\u53ca\u66f4\u590d\u6742\u7684\u64ad\u653e\u8bbe\u7f6e&#xff0c;\u9700\u8981\u7ed9\u64ad\u653e\u5668\u8bbe\u7f6e\u5a92\u4f53\u5217\u8868<br \/>\n    QMediaPlaylist* playList;<br \/>\n    \/\/ qqmusic.cpp \u4e2d\u6dfb\u52a0<br \/>\n    QQMusic::QQMusic(QWidget* parent)<br \/>\n        : QWidget(parent)<br \/>\n        , ui(new Ui::QQMusic)<br \/>\n    {<br \/>\n        ui-&gt;setupUi(this);<br \/>\n        \/\/ \u7a97\u2f1d\u63a7\u4ef6\u7684\u521d\u59cb\u5316\u2f2f\u4f5c<br \/>\n        initUI();<br \/>\n        \/\/ \u521d\u59cb\u5316\u64ad\u653e\u5668<br \/>\n        initPlayer();<br \/>\n        \/\/ \u5173\u8054\u6240\u6709\u4fe1\u53f7\u548c\u69fd<br \/>\n        connectSignalAndSlot();<br \/>\n    }<br \/>\n    void QQMusic::initPlayer()<br \/>\n    {<br \/>\n        \/\/ \u521b\u5efa\u64ad\u653e\u5668<br \/>\n        player &#061; new QMediaPlayer(this);<br \/>\n        \/\/ \u521b\u5efa\u64ad\u653e\u5217\u8868<br \/>\n        playList &#061; new QMediaPlaylist(this);<br \/>\n        \/\/ \u8bbe\u7f6e\u64ad\u653e\u6a21\u5f0f&#xff1a;\u9ed8\u8ba4\u4e3a\u5faa\u73af\u64ad\u653e<br \/>\n        playList-&gt;setPlaybackMode(QMediaPlaylist::Loop);<br \/>\n        \/\/ \u5c06\u64ad\u653e\u5217\u8868\u8bbe\u7f6e\u7ed9\u64ad\u653e\u5668<br \/>\n        player-&gt;setPlaylist(playList);<br \/>\n        \/\/ \u9ed8\u8ba4\u2fb3\u91cf\u2f24\u2f29\u8bbe\u7f6e\u4e3a20<br \/>\n        player-&gt;setVolume(20);<br \/>\n    } <\/p>\n<h3>2\u3001\u64ad\u653e\u5217\u8868\u8bbe\u7f6e<\/h3>\n<p>\u64ad\u653e\u4e4b\u524d&#xff0c;\u5148\u8981\u5c06\u6b4c\u66f2\u52a0\u5165\u7528\u4e8e\u64ad\u653e\u7684\u5a92\u4f53\u5217\u8868&#xff0c;\u7531\u4e8e\u6bcf\u4e2aCommonPage\u9875\u9762\u7684\u6b4c\u66f2\u4e0d\u540c&#xff0c;\u56e0\u6b64 CommonPage\u4e2d\u65b0\u589e\u5c06\u5176\u9875\u9762\u6b4c\u66f2\u6dfb\u52a0\u5230\u6a21\u4eff\u5217\u8868\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\/\/ commonpage.h \u4e2d\u65b0\u589e<br \/>\n#include &lt;QMediaPlaylist&gt;<br \/>\nvoid addMusicToPlayer(MusicList&amp; musicList, QMediaPlaylist* playList);<br \/>\n\/\/ commonpage.cpp \u4e2d\u65b0\u589e<br \/>\nvoid CommonPage::addMusicToPlayer(MusicList&amp; musicList, QMediaPlaylist* playList)<br \/>\n{<br \/>\n    \/\/ \u6839\u636e\u2fb3\u4e50\u5217\u8868\u4e2d\u2fb3\u4e50\u6240\u5c5e\u7684\u2eda\u2faf&#xff0c;\u5c06\u2fb3\u4e50\u6dfb\u52a0\u5230playList\u4e2d<br \/>\n    for (auto music : musicList)<br \/>\n    {<br \/>\n        switch (pageType)<br \/>\n        {<br \/>\n        case LOCAL_PAGE:<br \/>\n        {<br \/>\n            playList-&gt;addMedia(music.getMusicUrl());<br \/>\n            break;<br \/>\n        }<br \/>\n        case LIKE_PAGE:<br \/>\n        {<br \/>\n            if (music.getIsLike())<br \/>\n            {<br \/>\n                playList-&gt;addMedia(music.getMusicUrl());<br \/>\n            }<br \/>\n            break;<br \/>\n        }<br \/>\n        case HISTORY_PAGE:<br \/>\n        {<br \/>\n            if (music.getIsHistory())<br \/>\n            {<br \/>\n                playList-&gt;addMedia(music.getMusicUrl());<br \/>\n            }<br \/>\n            break;<br \/>\n        }<br \/>\n        default:<br \/>\n            break;<br \/>\n        }<br \/>\n    }<br \/>\n} <\/p>\n<h3>3\u3001\u64ad\u653e\u548c\u6682\u505c<\/h3>\n<p>\u5f53\u70b9\u51fb\u64ad\u653e\u548c\u6682\u505c\u6309\u94ae\u65f6&#xff0c;\u64ad\u653e\u72b6\u6001\u5e94\u8be5\u5728\u64ad\u653e\u548c\u6682\u505c\u4e4b\u95f4\u5207\u6362\u3002\u64ad\u653e\u5668\u7684\u72b6\u6001\u5982\u4e0b&#xff0c;\u521a\u5f00\u59cb\u4e3a\u505c\u6b62\u72b6\u6001QMediaPlayer\u7684\u64ad\u653e\u72b6\u6001\u6709:PlayingState()\u3001PausedState()\u3001StoppedState()\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u64ad\u653e\u63a7\u5236\u533a\u57df<br \/>\nvoid onPlayCliked(); \/\/ \u64ad\u653e\u6309\u94ae<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onPlayCliked()<br \/>\n{<br \/>\n    qDebug() &lt;&lt; &#034;\u64ad\u653e\u6309\u94ae\u70b9\u51fb&#034;;<br \/>\n    if (player-&gt;state() &#061;&#061; QMediaPlayer::PlayingState) {<br \/>\n        \/\/ \u5982\u679c\u662f\u6b4c\u66f2\u6b63\u5728\u64ad\u653e\u4e2d&#xff0c;\u6309\u4e0b\u64ad\u653e\u952e&#xff0c;\u6b64\u65f6\u5e94\u8be5\u6682\u505c\u64ad\u653e<br \/>\n        player-&gt;pause();<br \/>\n    }<br \/>\n    else if (player-&gt;state() &#061;&#061; QMediaPlayer::PausedState)<br \/>\n    {<br \/>\n        \/\/ \u5982\u679c\u662f\u6682\u505c\u72b6\u6001&#xff0c;\u6309\u4e0b\u64ad\u653e\u952e&#xff0c;\u7ee7\u7eed\u5f00\u59cb\u64ad\u653e<br \/>\n        player-&gt;play();<br \/>\n    }<br \/>\n    else if (player-&gt;state() &#061;&#061; QMediaPlayer::StoppedState)<br \/>\n    {<br \/>\n        player-&gt;play();<br \/>\n    }<br \/>\n}<br \/>\nvoid QQMusic::connectSignalAndSlots()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u64ad\u653e\u63a7\u5236\u533a\u7684\u4fe1\u53f7\u548c\u69fd\u51fd\u6570\u5173\u8054<br \/>\n    connect(ui-&gt;play, &amp;QPushButton::clicked, this, &amp;QQMusic::onPlayMusic);<br \/>\n} <\/p>\n<p>\u6ce8\u610f&#xff1a;\u64ad\u653e\u65f6\u9ed8\u8ba4\u662f\u4ece\u64ad\u653e\u5217\u8868\u7d22\u5f15\u4e3a0\u7684\u6b4c\u66f2\u5f00\u59cb\u64ad\u653e\u7684\u3002 \u53e6\u5916\u64ad\u653e\u72b6\u6001\u6539\u53d8\u7684\u65f6\u5019&#xff0c;\u9700\u8981\u4fee\u6539\u64ad\u653e\u6309\u94ae\u4e0a\u56fe\u6807&#xff0c;\u56fe\u7247\u7684\u4fee\u6539\u53ef\u4ee5\u5728onPlayCliked\u51fd\u6570\u4e2d\u8bbe\u7f6e&#xff0c;\u4e5f\u53ef\u4ee5\u62e6\u622aQMediaPlayer\u4e2d\u7684stateChanged\u4fe1\u53f7&#xff0c;\u5f53\u64ad\u653e\u72b6\u6001\u6539\u53d8\u7684\u65f6\u5019&#xff0c;QMediaPlayer\u4f1a\u89e6\u53d1\u8be5\u4fe1\u53f7&#xff0c;\u5728stateChanged\u4fe1\u53f7\u4e2d\u4fee\u6539\u64ad\u653e\u6309\u94ae\u4e5f\u53ef\u4ee5&#xff0c;\u6b64\u5904\u62e6\u622astateChanged\u4fe1\u53f7\u3002<\/p>\n<p>\/\/ qqmusic.h \u65b0\u589e<br \/>\n\/\/ QMediaPlayer\u4fe1\u53f7\u5904\u7406<br \/>\n\/\/ \u64ad\u653e\u72b6\u6001\u53d1\u2f63\u6539\u53d8<br \/>\nvoid onPlayStateChanged();<\/p>\n<p>\/\/ qqmusic.cpp \u65b0\u589e<br \/>\n\/\/ QMediaPlayer\u4fe1\u53f7\u5173\u8054\u69fd\u51fd\u6570<br \/>\nvoid QQMusic::onPlayStateChanged()<br \/>\n{<br \/>\n    qDebug() &lt;&lt; &#034;\u64ad\u653e\u72b6\u6001\u6539\u53d8&#034;;<br \/>\n    if (player-&gt;state() &#061;&#061; QMediaPlayer::PlayingState)<br \/>\n    {<br \/>\n        \/\/ \u64ad\u653e\u72b6\u6001<br \/>\n        ui-&gt;play-&gt;setIcon(QIcon(&#034;:\/images\/play_on.png&#034;));<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        \/\/ \u6682\u505c\u72b6\u6001<br \/>\n        ui-&gt;play-&gt;setIcon(QIcon(&#034;:\/images\/play3.png&#034;));<br \/>\n    }<br \/>\n}<br \/>\nvoid QQMusic::initPlayer()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ QMediaPlayer\u4fe1\u53f7\u548c\u69fd\u51fd\u6570\u5173\u8054<br \/>\n    \/\/ \u64ad\u653e\u72b6\u6001\u6539\u53d8\u65f6&#xff1a;\u6682\u505c\u548c\u64ad\u653e\u4e4b\u95f4\u5207\u6362<br \/>\n    connect(player, &amp;QMediaPlayer::stateChanged, this, &amp;QQMusic::onPlayStateChanged);<br \/>\n} <\/p>\n<p>\u64ad\u653e\u548c\u6682\u505c\u5207\u6362\u7684\u65f6\u5019&#xff0c;\u6309\u94ae\u4e0a\u7684\u56fe\u6807\u6709\u91cd\u53e0&#xff0c;\u662f\u56e0\u4e3a\u4e4b\u524d\u5728\u754c\u9762\u8bbe\u7f6e\u7684\u65f6\u5019&#xff0c;\u4e3a\u4e86\u80fd\u770b\u5230\u6548\u679c&#xff0c;\u7ed9\u6309\u94ae\u6dfb\u52a0\u4e86\u80cc\u666f\u56fe\u7247&#xff0c;\u80cc\u666f\u56fe\u7247\u548c\u56fe\u6807\u662f\u4e24\u79cd\u5c5e\u6027&#xff0c;\u90fd\u8bbe\u7f6e\u65f6\u5c31ui\u53e0\u52a0&#xff0c;\u56e0\u6b64\u5c06\u6309\u94ae\u4e0a\u4e2a\u6dfb\u52a0\u80cc\u666f\u56fe\u7247\u6837\u5f0f\u53bb\u9664\u6389\u3002<\/p>\n<p>void QQMusic::initUi()<br \/>\n{<br \/>\n    \/\/ \u6309\u94ae\u7684\u80cc\u666f\u56fe\u2f5a\u6837\u5f0f\u53bb\u9664\u6389\u4e4b\u540e&#xff0c;\u9700\u8981\u8bbe\u7f6e\u9ed8\u8ba4\u56fe\u6807<br \/>\n    \/\/ \u64ad\u653e\u63a7\u5236\u533a\u6309\u94ae\u56fe\u6807\u8bbe\u5b9a<br \/>\n    ui-&gt;play-&gt;setIcon(QIcon(&#034;:\/images\/play_2.png&#034;)); \/\/ \u9ed8\u8ba4\u4e3a\u6682\u505c\u56fe\u6807<br \/>\n    ui-&gt;playMode-&gt;setIcon(QIcon(&#034;:\/images\/shuffle_2.png&#034;)); \/\/ \u9ed8\u8ba4\u4e3a\u968f\u673a\u64ad\u653e<br \/>\n    volumeTool &#061; new VolumeTool(this);<br \/>\n} <\/p>\n<p>4\u3001\u4e0a\u4e00\u66f2\u548c\u4e0b\u4e00\u66f2<\/p>\n<p>\u64ad\u653e\u5217\u8868\u4e2d&#xff0c;\u63d0\u4f9b\u4e86previous()\u548cnext()\u51fd\u6570&#xff0c;\u901a\u8fc7\u8bbe\u7f6e\u524d\u4e00\u4e2a\u6216\u8005\u4e0b\u4e00\u4e2a\u6b4c\u66f2\u4e3a\u5f53\u524d\u64ad\u653e\u6e90&#xff0c;player\u5c31\u4f1a\u64ad\u653e\u5bf9\u5e94\u7684\u6b4c\u66f2\u3002<\/p>\n<p>\/\/ qqmusic.h \u65b0\u589e<br \/>\nvoid onPlayUpCliked(); \/\/ \u4e0a\u2f00\u66f2<br \/>\nvoid onPlayDownCliked(); \/\/ \u4e0b\u2f00\u66f2<br \/>\n\/\/ qqmusic.cpp \u65b0\u589e<br \/>\nvoid QQMusic::onPlayUpCliked()<br \/>\n{<br \/>\n    playList-&gt;previous();<br \/>\n}<br \/>\nvoid QQMusic::onPlayDownCliked()<br \/>\n{<br \/>\n    playList-&gt;next();<br \/>\n}<br \/>\nvoid QQMusic::connectSignalAndSlots()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u64ad\u653e\u63a7\u5236\u533a\u7684\u4fe1\u53f7\u548c\u69fd\u51fd\u6570\u5173\u8054<br \/>\n    connect(ui-&gt;play, &amp;QPushButton::clicked, this, &amp;QQMusic::onPlayMusic);<br \/>\n    connect(ui-&gt;playUp, &amp;QPushButton::clicked, this, &amp;QQMusic::onPlayUpClicked);<br \/>\n    connect(ui-&gt;playDown, &amp;QPushButton::clicked, this, &amp;QQMusic::onPlayDownClicked);<br \/>\n} <\/p>\n<h3>4\u3001\u5207\u6362\u64ad\u653e\u6a21\u5f0f<\/h3>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\nvoid onPlaybackModeCliked(); \/\/ \u64ad\u653e\u6a21\u5f0f\u8bbe\u7f6e<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::initPlayer()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u8bbe\u7f6e\u64ad\u653e\u6a21\u5f0f<br \/>\n    connect(ui-&gt;playMode, &amp;QPushButton::clicked, this,&amp;QQMusic::onPlaybackModeCliked);<br \/>\n}<br \/>\nvoid QQMusic::onPlaybackModeCliked()<br \/>\n{<br \/>\n    \/\/ \u64ad\u653e\u6a21\u5f0f\u662f\u9488\u5bf9\u64ad\u653e\u5217\u8868\u7684<br \/>\n    \/\/ \u64ad\u653e\u6a21\u5f0f\u2f40\u6301&#xff1a;\u5faa\u73af\u64ad\u653e\u3001\u968f\u673a\u64ad\u653e\u3001\u5355\u66f2\u5faa\u73af\u4e09\u79cd\u6a21\u5f0f<br \/>\n    if (playList-&gt;playbackMode() &#061;&#061; QMediaPlaylist::Loop)<br \/>\n    {<br \/>\n        \/\/ \u5217\u8868\u5faa\u73af<br \/>\n        ui-&gt;playMode-&gt;setToolTip(&#034;\u968f\u673a\u64ad\u653e&#034;);<br \/>\n        playList-&gt;setPlaybackMode(QMediaPlaylist::Random);<br \/>\n    }<br \/>\n    else if (playList-&gt;playbackMode() &#061;&#061; QMediaPlaylist::Random)<br \/>\n    {<br \/>\n        \/\/ \u968f\u673a\u64ad\u653e<br \/>\n        ui-&gt;playMode-&gt;setToolTip(&#034;\u5355\u66f2\u5faa\u73af&#034;);<br \/>\n        playList-&gt;setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);<br \/>\n    }<br \/>\n    else if (playList-&gt;playbackMode() &#061;&#061; QMediaPlaylist::CurrentItemInLoop)<br \/>\n    {<br \/>\n        ui-&gt;playMode-&gt;setToolTip(&#034;\u5217\u8868\u5faa\u73af&#034;);<br \/>\n        playList-&gt;setPlaybackMode(QMediaPlaylist::Loop);<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u64ad\u653e\u6a21\u5f0f\u9519\u8bef&#034;;<br \/>\n    }<br \/>\n} <\/p>\n<p>\u64ad\u653e\u6a21\u5f0f\u5207\u6362\u65f6\u4f1a\u89e6\u53d1playbackModeChanged\u4fe1\u53f7&#xff0c;\u5728\u8be5\u4fe1\u53f7\u5bf9\u5e94\u69fd\u51fd\u6570\u4e2d&#xff0c;\u5b8c\u6210\u56fe\u7247\u5207\u6362\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u64ad\u653e\u6a21\u5f0f\u5207\u6362\u69fd\u51fd\u6570<br \/>\nvoid onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode);<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode)<br \/>\n{<br \/>\n    if (playbackMode &#061;&#061; QMediaPlaylist::Loop)<br \/>\n    {<br \/>\n        ui-&gt;playMode-&gt;setIcon(QIcon(&#034;:\/images\/list_play.png&#034;));<br \/>\n    }<br \/>\n    else if (playbackMode &#061;&#061; QMediaPlaylist::Random)<br \/>\n    {<br \/>\n        ui-&gt;playMode-&gt;setIcon(QIcon(&#034;:\/images\/shuffle_2.png&#034;));<br \/>\n    }<br \/>\n    else if (playbackMode &#061;&#061; QMediaPlaylist::CurrentItemInLoop)<br \/>\n    {<br \/>\n        ui-&gt;playMode-&gt;setIcon(QIcon(&#034;:\/images\/single_play.png&#034;));<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u6682\u4e0d\u2f40\u6301\u8be5\u6a21\u5f0f&#034;;<br \/>\n    }<br \/>\n}<br \/>\nvoid QQMusic::initPlayer()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u64ad\u653e\u5217\u8868\u7684\u6a21\u5f0f\u653e\u2f63\u6539\u53d8\u65f6\u7684\u4fe1\u53f7\u69fd\u5173\u8054<br \/>\n    connect(playList, &amp;QMediaPlaylist::playbackModeChanged, this,<br \/>\n        &amp;QQMusic::onPlaybackModeChanged);<br \/>\n} <\/p>\n<h3>5\u3001\u64ad\u653e\u6240\u6709<\/h3>\n<p>\u64ad\u653e\u6240\u6709\u6309\u94ae\u5c5e\u4e8eCommonPage\u4e2d\u7684\u6309\u94ae&#xff0c;\u5176\u5bf9\u5e94\u7684\u69fd\u51fd\u6570\u6dfb\u52a0\u5728CommonPage\u7c7b\u4e2d&#xff0c;\u4f46\u662f CommonPage\u4e0d\u5177\u6709\u97f3\u4e50\u64ad\u653e\u7684\u529f\u80fd&#xff0c;\u56e0\u6b64\u5f53\u70b9\u51fb\u64ad\u653e\u6240\u6709\u6309\u94ae\u540e\u4e4b\u540e&#xff0c;\u64ad\u653e\u6240\u6709\u7684\u69fd\u51fd\u6570\u5e94\u8be5\u53d1\u5c04\u51fa\u4fe1\u53f7&#xff0c;\u8ba9QQMusic\u7c7b\u5b8c\u6210\u64ad\u653e\u3002\u7531\u4e8elikePage\u3001localPage\u3001recentPage\u4e09\u4e2aCommonPage\u9875\u9762\u90fd\u6709playAllBtn&#xff0c;\u56e0\u6b64\u8be5\u4fe1\u53f7\u9700\u8981\u5e26\u4e0aPageType\u53c2\u6570&#xff0c;\u9700\u8981\u8ba9QQMusic\u5728\u5904\u7406\u8be5\u4fe1\u53f7\u65f6&#xff0c;\u77e5\u9053\u64ad\u653e\u54ea\u4e2a\u9875\u9762\u7684\u6b4c\u66f2\u3002<\/p>\n<p>\/\/ commonpage.h \u4e2d\u65b0\u589e\u52a0<br \/>\nsignals:<br \/>\n    \/\/ \u8be5\u4fe1\u53f7\u7531QQMusic\u5904\u7406&#8211;\u5728\u6784\u51fd\u6570\u4e2d\u6355\u83b7<br \/>\n    void playAll(PageType pageType);<br \/>\n    \/\/ commonpage.cpp \u4e2d\u4fee\u6539<br \/>\n    CommonPage::CommonPage(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::CommonPage)<br \/>\n    {<br \/>\n        ui-&gt;setupUi(this);<br \/>\n        \/\/ playAllBtn\u6309\u94ae\u7684\u4fe1\u53f7\u69fd\u5904\u7406<br \/>\n        \/\/ \u5f53\u64ad\u653e\u6309\u94ae\u70b9\u51fb\u65f6&#xff0c;\u53d1\u5c04playAll\u4fe1\u53f7&#xff0c;\u64ad\u653e\u5f53\u524d\u2eda\u2faf\u7684\u6240\u6709\u6b4c\u66f2<br \/>\n        \/\/ playAll\u4fe1\u53f7\u4ea4\u7531QQMusic\u4e2d\u5904\u7406<br \/>\n        connect(ui-&gt;playAllBtn, &amp;QPushButton::clicked, this, [&#061;]() {<br \/>\n            emit playAll(pageType);<br \/>\n            });<\/p>\n<p>        \/\/ &#8230;<br \/>\n    } <\/p>\n<p>\u5728QQMusic\u4e2d&#xff0c;\u7ed9playAll\u4fe1\u53f7\u5173\u8054\u69fd\u51fd\u6570&#xff0c;\u5e76\u64ad\u653e\u5f53\u524dPage\u9875\u9762\u7684\u6240\u6709\u97f3\u4e50\u3002playAll\u69fd\u51fd\u6570\u4e2d&#xff0c;\u6839\u636epageType\u5c06\u5f53\u524dpage\u9875\u9762\u8bb0\u5f55\u4e0b\u6765&#xff0c;\u9ed8\u8ba4\u4ece\u8be5\u9875\u9762\u7684\u7b2c0\u9996\u6b4c\u66f2\u5f00\u59cb\u64ad\u653e\u3002\u6ce8\u610f\u4e0d\u8981\u5fd8\u8bb0\u5173\u8054\u4fe1\u53f7\u69fd\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u64ad\u653e\u6240\u6709\u4fe1\u53f7\u7684\u69fd\u51fd\u6570<br \/>\n#include &#034;commonpage.h&#034;<br \/>\nvoid onPlayAll(PageType pageType);<br \/>\nvoid playAllOfCommonPage(CommonPage* commonPage, int index);<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onPlayAll(PageType pageType)<br \/>\n{<br \/>\n    CommonPage* page &#061; nullptr;<br \/>\n    switch (pageType)<br \/>\n    {<br \/>\n    case PageType::LIKE_PAGE:<br \/>\n        page &#061; ui-&gt;likePage;<br \/>\n        break;<br \/>\n    case PageType::LOCAL_PAGE:<br \/>\n        page &#061; ui-&gt;localPage;<br \/>\n        break;<br \/>\n    case PageType::HOSTORY_PAGE:<br \/>\n        page &#061; ui-&gt;recentPage;<br \/>\n        break;<br \/>\n    default:<br \/>\n        qDebug() &lt;&lt; &#034;\u6269\u5c55&#034;;<br \/>\n    }<br \/>\n    \/\/ \u4ece\u5f53\u524d\u2eda\u2faf\u7684\u96f6\u53f7\u4f4d\u7f6e\u5f00\u59cb\u64ad\u653e<br \/>\n    playAllOfCommonPage(page, 0);<br \/>\n}<br \/>\nvoid QQMusic::playAllOfCommonPage(CommonPage* commonPage, int index)<br \/>\n{<br \/>\n    \/\/ \u64ad\u653epage\u6240\u5728\u2eda\u2faf\u7684\u2fb3\u4e50<br \/>\n    \/\/ \u5c06\u64ad\u653e\u5217\u8868\u5148\u6e05\u7a7a&#xff0c;\u5426\u5219\u2f46\u6cd5\u64ad\u653e\u5f53\u524dCommonPage\u2eda\u2faf\u7684\u6b4c\u66f2<br \/>\n    \/\/ \u53e6\u5916&#xff1a;\u8be5\u2eda\u2faf\u2fb3\u4e50\u4e0d\u2f00\u5b9a\u5c31\u5728\u64ad\u653e\u5217\u8868\u4e2d&#xff0c;\u56e0\u6b64\u9700\u8981\u5148\u5c06\u8be5\u2eda\u2faf\u2fb3\u4e50\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868<br \/>\n    playList-&gt;clear();<br \/>\n    \/\/ \u5c06\u5f53\u524d\u2eda\u2faf\u6b4c\u66f2\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868<br \/>\n    page-&gt;addMusicToPlayer(musicList, playList);<br \/>\n    \/\/ \u8bbe\u7f6e\u5f53\u524d\u64ad\u653e\u5217\u8868\u7684\u7d22\u5f15<br \/>\n    playList-&gt;setCurrentIndex(index);<br \/>\n    \/\/ \u64ad\u653e<br \/>\n    player-&gt;play();<br \/>\n}<br \/>\nvoid QQMusic::connectSignalAndSlots()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u5173\u8054\u64ad\u653e\u6240\u6709\u7684\u4fe1\u53f7\u548c\u69fd\u51fd\u6570<br \/>\n    connect(ui-&gt;likePage, &amp;CommonPage::playAll, this, &amp;QQMusic::onPlayAll);<br \/>\n    connect(ui-&gt;localPage, &amp;CommonPage::playAll, this, &amp;QQMusic::onPlayAll);<br \/>\n    connect(ui-&gt;recentPage, &amp;CommonPage::playAll, this, &amp;QQMusic::onPlayAll);<br \/>\n} <\/p>\n<h3>6\u3001\u9f20\u6807\u53cc\u51fb\u64ad\u653e<\/h3>\n<p>\u5f53QListWidget\u4e2d\u7684\u9879\u88ab\u53cc\u51fb\u65f6&#xff0c;\u4f1a\u89e6\u53d1doubleClicked\u4fe1\u53f7&#xff0c;\u8be5\u4fe1\u53f7\u5728QListWidget\u7684\u57fa\u7c7b\u4e2d\u5b9a\u4e49&#xff0c;\u6709\u4e00\u4e2aindex\u53c2\u6570&#xff0c;\u8868\u793a\u88ab\u53cc\u51fb\u7684QListWidgetItem\u5728QListWidget\u4e2d\u7684\u7d22\u5f15I&#xff0c;\u8be5\u7d22\u5f15\u521a\u597d\u4e0eQMediaPlaylist\u4e2d\u6b4c\u66f2\u7684\u6240\u4ee5\u4e00\u81f4&#xff0c;\u88ab\u53cc\u51fb\u65f6\u76f4\u63a5\u64ad\u653e\u8be5\u9996\u6b4c\u66f2\u5373\u53ef\u3002<\/p>\n<p>\/\/ CommonPage.h \u4e2d\u65b0\u589e<br \/>\nsignals:<br \/>\n    void playMusicByIndex(CommonPage*, int);<br \/>\n    \/\/ commonpage.cpp \u4e2d\u65b0\u589e<br \/>\n    CommonPage::CommonPage(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::CommonPage)<br \/>\n    {<br \/>\n        \/\/ &#8230;<\/p>\n<p>        connect(ui-&gt;pageMusicList, &amp;QListWidget::doubleClicked, this, [&#061;](const<br \/>\n            QModelIndex&amp; index) {<br \/>\n                \/\/ \u2fcf\u6807\u53cc\u51fb\u540e&#xff0c;\u53d1\u5c04\u4fe1\u53f7\u544a\u8bc9QQMusic&#xff0c;\u535a\u80fd\u653ethis\u2eda\u2faf\u4e2d\u5171\u88ab\u53cc\u51fb\u7684\u6b4c\u66f2<br \/>\n                emit playMusicByIndex(this, index.row());<br \/>\n            });<br \/>\n    }<\/p>\n<p>    \/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n    \/\/ CommonPage\u4e2dplayMusicByIndex\u4fe1\u53f7\u5bf9\u5e94\u69fd\u51fd\u6570<br \/>\n    void playMusicByIndex(CommonPage* page, int index);<br \/>\n    \/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\n    void QQMusic::playMusicByIndex(CommonPage* page, int index)<br \/>\n    {<br \/>\n        playAllMusicOfCommonPage(page, index);<br \/>\n    }<br \/>\n    void QQMusic::connectSignalAndSlots()<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        \/\/ \u5904\u7406likePage\u3001localPage\u3001recentPage\u4e2dListItemBox\u53cc\u51fb<br \/>\n        connect(ui-&gt;likePage, &amp;CommonPage::playMusicByIndex, this,<br \/>\n            &amp;QQMusic::playMusicByIndex);<br \/>\n        connect(ui-&gt;localPage, &amp;CommonPage::playMusicByIndex, this,<br \/>\n            &amp;QQMusic::playMusicByIndex);<br \/>\n        connect(ui-&gt;recentPage, &amp;CommonPage::playMusicByIndex, this,<br \/>\n            &amp;QQMusic::playMusicByIndex);<br \/>\n    } <\/p>\n<h3>7\u3001\u540c\u6b65\u6700\u8fd1\u64ad\u653e\u7684\u6b4c\u66f2<\/h3>\n<p>\u5f53\u64ad\u653e\u6b4c\u66f2\u6539\u53d8\u65f6&#xff0c;\u5373\u64ad\u653e\u7684\u5a92\u4f53\u6e90\u53d1\u751f\u4e86\u53d8\u5316&#xff0c;QMediaPlayer\u4f1a\u89e6metaDataAvailableChanged\u4fe1\u53f7&#xff0c;QMediaPlaylist\u4e5f\u4f1a\u89e6\u53d1currentIndexChanged\u4fe1\u53f7&#xff0c;\u8be5\u4fe1\u53f7\u4f1a\u5e26index\u53c2\u6570&#xff0c;\u8868\u793a\u73b0\u5728\u662f\u5a92\u4f53\u64ad\u653e\u5217\u8868\u4e2d\u7684index\u6b4c\u66f2\u88ab\u64ad\u653e&#xff0c;\u901a\u8fc7index\u53ef\u4ee5\u83b7\u53d6\u5230recentPage\u9875\u9762\u4e2d\u5177\u4f53\u64ad\u653e\u7684\u6b4c\u66f2&#xff0c;\u5c06\u8be5\u6b4c\u66f2\u5bf9\u5e94Music\u5bf9\u8c61\u7684isHistoty\u5c5e\u6027\u4fee\u6539\u4e3atrue&#xff0c;\u7136\u540e\u66f4\u65b0\u4e0brencentPage\u7684\u6b4c\u66f2\u5217\u8868&#xff0c;\u64ad\u653e\u8fc7\u7684\u6b4c\u66f2\u5c31\u6dfb\u52a0\u5230\u5386\u53f2\u64ad\u653e\u9875\u9762\u4e2d\u4e86\u3002 \u95ee\u9898&#xff1a;\u83b7\u53d6likePage\u3001localPage\u3001recentPage\u54ea\u4e2aCommonPage\u9875\u9762\u4e2d\u7684\u6b4c\u66f2\u5462? \u7b54\u6848&#xff1a;QQMusic\u7c7b\u4e2d\u7ef4\u62a4CommonPage*\u53d8\u91cfcurrentPage&#xff0c;\u8bb0\u5f55\u5f53\u524d\u6b63\u5728\u64ad\u653e\u7684CommonPage\u9875 \u9762&#xff0c;\u521d\u59cb\u65f6\u8bbe\u7f6e\u4e3alocalPage&#xff0c;\u5f53\u64ad\u653e\u7684\u9875\u9762\u53d1\u751f\u6539\u53d8\u65f6&#xff0c;\u4fee\u6539currentPage\u4e3a\u5f53\u524d\u6b63\u5728\u64ad\u653e\u9875\u9762&#xff0c;\u5176\u4e2d\u70b9\u51fb\u64ad\u653e\u6240\u6709\u6309\u94ae\u4ee5\u53ca\u53cc\u51fbQListWidget\u4e2d\u9879\u7684\u65f6\u5019\u90fd\u56de\u5f15\u8d77currentPage\u7684\u6539\u53d8\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\nCommonPage* curPage;<br \/>\n\/\/ qqmusic.cpp \u4e2d\u4fee\u6539<br \/>\nvoid QQMusic::initUi()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u5c06localPage\u8bbe\u7f6e\u4e3a\u5f53\u524d\u2eda\u2faf<br \/>\n    ui-&gt;stackedWidget-&gt;setCurrentIndex(4);<br \/>\n    currentPage &#061; ui-&gt;localPage;<\/p>\n<p>    \/\/ &#8230;<br \/>\n}<br \/>\nvoid QQMusic::playAllOfCommonPage(CommonPage* commonPage, int index)<br \/>\n{<br \/>\n    currentPage &#061; commonPage;<br \/>\n    \/\/ \u64ad\u653epage\u6240\u5728\u2eda\u2faf\u7684\u2fb3\u4e50<br \/>\n    \/\/ \u5c06\u64ad\u653e\u5217\u8868\u5148\u6e05\u7a7a&#xff0c;\u5426\u5219\u2f46\u6cd5\u64ad\u653e\u5f53\u524dCommonPage\u2eda\u2faf\u7684\u6b4c\u66f2<br \/>\n    \/\/ \u53e6\u5916&#xff1a;\u8be5\u2eda\u2faf\u2fb3\u4e50\u4e0d\u2f00\u5b9a\u5c31\u5728\u64ad\u653e\u5217\u8868\u4e2d&#xff0c;\u56e0\u6b64\u9700\u8981\u5148\u5c06\u8be5\u2eda\u2faf\u2fb3\u4e50\u6dfb\u52a0\u5230\u64ad\u653e\u5217\u8868<br \/>\n    playList-&gt;clear();<\/p>\n<p>    \/\/ &#8230;<br \/>\n} <\/p>\n<p>\u51c6\u5907\u5de5\u4f5c\u5b8c\u6210\u4e4b\u540e&#xff0c;\u540c\u6b65\u6700\u8fd1\u64ad\u653e\u6b4c\u66f2\u7684\u903b\u8f91\u5b9e\u73b0\u5982\u4e0b&#xff1a;<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u2f40\u6301\u64ad\u653e\u5386\u53f2\u8bb0\u5f55<br \/>\nvoid onCurrentIndexChanged(int index);<\/p>\n<p>\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::initPlayer(int index)<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u64ad\u653e\u5217\u8868\u9879\u53d1\u2f63\u6539\u53d8&#xff0c;\u6b64\u65f6\u5c06\u64ad\u653e\u2fb3\u4e50\u6536\u85cf\u5230\u5386\u53f2\u8bb0\u5f55\u4e2d<br \/>\n    connect(playList, &amp;QMediaPlaylist::currentIndexChanged, this,<br \/>\n        &amp;QQMusic::onCurrentIndexChanged);<br \/>\n}<br \/>\nvoid QQMusic::onCurrentIndexChanged(int index)<br \/>\n{<br \/>\n    \/\/ \u2fb3\u4e50\u7684id\u90fd\u5728commonPage\u4e2d\u7684musicListOfPage\u4e2d\u5b58\u50a8\u7740<br \/>\n    const QString&amp; musicId &#061; currentPage-&gt;getMusicIdByIndex(index);<br \/>\n    \/\/ \u6709\u4e86MusicId\u5c31\u53ef\u4ee5\u518dmusicList\u4e2d\u627e\u5230\u8be5\u2fb3\u4e50<br \/>\n    auto it &#061; musicList.findMusicByMusicId(musicId);<br \/>\n    if (it !&#061; musicList.end())<br \/>\n    {<br \/>\n        \/\/ \u5c06\u8be5\u2fb3\u4e50\u8bbe\u7f6e\u4e3a\u5386\u53f2\u64ad\u653e\u8bb0\u5f55<br \/>\n        it-&gt;setIsHistory(true);<br \/>\n    }<br \/>\n    ui-&gt;recentPage-&gt;reFresh(musicList);<br \/>\n}<br \/>\n\/\/ commmonpage.h \u4e2d\u65b0\u589e<br \/>\nconst QString&amp; getMusicIdByIndex(int index) const;<br \/>\n\/\/ commonpage.cpp \u4e2d\u65b0\u589e<br \/>\nQString CommonPage::getMusicIdByIndex(int index)<br \/>\n{<br \/>\n    if (index &gt;&#061; musicOfPage.size())<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u2f46\u6b64\u6b4c\u66f2&#034;;<br \/>\n        return &#034;&#034;;<br \/>\n    }<br \/>\n    return musicOfPage[index];<br \/>\n} <\/p>\n<h3>8\u3001\u97f3\u91cf\u8bbe\u7f6e<\/h3>\n<h4>a\u3001\u529f\u80fd\u5206\u6790<\/h4>\n<p>\u5f53\u70b9\u51fb\u9759\u97f3\u6309\u94ae\u65f6&#xff0c;\u97f3\u91cf\u5e94\u8be5\u5728\u9759\u97f3\u548c\u975e\u9759\u97f3\u4e4b\u95f4\u8fdb\u884c\u5207\u6362&#xff0c;\u5e76\u4e14\u6309\u94ae\u4e0a\u56fe\u6807\u9700\u8981\u540c\u6b65\u5207\u6362\u3002 \u9f20\u6807\u5728\u6ed1\u7aff\u4e0a\u70b9\u51fb\u6216\u62d6\u52a8\u6ed1\u7aff\u65f6&#xff0c;\u5e94\u8be5\u8ddf\u8fdb\u6ed1\u7aff\u7684\u9ad8\u4f4e\u6bd4\u7387&#xff0c;\u8bbe\u7f6e\u97f3\u91cf\u5927\u5c0f&#xff0c;\u540c\u65f6\u4fee\u6539\u754c\u9762\u97f3\u91cf\u6bd4 \u7387\u3002<\/p>\n<h4>b. QMediaPlayer\u63d0\u4f9b\u652f\u6301<\/h4>\n<p> QMediaPlayer\u4e2d\u97f3\u91cf\u76f8\u5173\u64cd\u4f5c\u5982\u4e0b&#xff1a;<\/p>\n<p>int volume; \/\/ \u6807\u8bb0\u2fb3\u91cf\u2f24\u2f29&#xff0c;\u503c\u57280~100\u4e4b\u95f4 int volume()const; \/\/ \u83b7\u53d6\u2fb3\u91cf\u2f24\u2f29 void setVolume(int); \/\/ \u69fd\u51fd\u6570&#xff1a;\u8bbe\u7f6e\u2fb3\u91cf\u2f24\u2f29 bool muted; \/\/ \u662f\u5426\u9759\u2fb3&#xff0c;true\u4e3a\u9759\u2fb3&#xff0c;false\u4e3a\u2fae\u9759\u2fb3 bool isMuted()const; \/\/ \u83b7\u53d6\u9759\u2fb3\u72b6\u6001 bool setMuted(bool muted); \/\/ \u69fd\u51fd\u6570&#xff1a;\u8bbe\u7f6e\u9759\u2fb3\u6216\u2fae\u9759\u2fb3<\/p>\n<h4>c\u3001\u9759\u97f3\u548c\u975e\u9759\u97f3<\/h4>\n<p>VolumeTool\u7c7b\u4e2d\u9700\u8981\u6dfb\u52a0\u4e24\u4e2a\u6210\u5458\u53d8\u91cf&#xff0c;\u5e76\u5728\u6784\u9020\u51fd\u6570\u4e2d\u5b8c\u6210\u9ed8\u8ba4\u503c\u7684\u8bbe\u7f6e\u3002 \u7ed9\u9759\u97f3\u6309\u94ae\u53c2\u52a0\u69fd\u51fd\u6570onSilenceBtnClicked&#xff0c;\u5e76\u5728\u6784\u9020\u51fd\u6570\u4e2dconnect\u6309\u94ae\u7684clicked\u4fe1\u53f7&#xff0c;\u5f53\u6309 \u94ae\u70b9\u51fb\u65f6\u5019&#xff0c;\u8c03\u7528setMuted(boolnuted)\u51fd\u6570&#xff0c;\u5b8c\u6210\u9759\u97f3\u548c\u975e\u9759\u97f3\u7684\u8bbe\u7f6e\u3002 \u7531\u4e8eVolumeTool\u4e0d\u5177\u5907\u5a92\u4f53\u64ad\u653e\u63a7\u5236&#xff0c;\u56e0\u6b64\u5f53\u9759\u97f3\u72b6\u6001\u53d1\u751f\u6539\u53d8\u65f6&#xff0c;\u53d1\u5c04\u8bbe\u7f6e\u9759\u97f3\u4fe1\u53f7&#xff0c;\u8ba9 QQMusic\u6765\u5904\u7406\u3002\u00a0<\/p>\n<p>\/\/ volumetool.h \u4e2d\u65b0\u589e<br \/>\nsignals:<br \/>\n    void setSilence(bool); \/\/ \u8bbe\u7f6e\u9759\u2fb3\u4fe1\u53f7<br \/>\n    void onSilenceBtnClicked(); \/\/ \u9759\u2fb3\u6309\u94ae\u69fd\u51fd\u6570<br \/>\n    bool isMuted; \/\/ \u8bb0\u5f55\u9759\u2fb3\u6216\u2fae\u9759\u2fb3&#xff0c;\u5f53\u70b9\u51fb\u9759\u2fb3\u6309\u94ae\u65f6&#xff0c;\u5728true\u548cfalse\u4e4b\u95f4\u5207\u6362<br \/>\n    int volumeRatio; \/\/ \u6807\u8bb0\u2fb3\u91cf\u2f24\u2f29<br \/>\n    \/\/ volumetool.cpp \u4e2d\u65b0\u589e<br \/>\n    VolumeTool::VolumeTool(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::VolumeTool),<br \/>\n        isMuted(false), \/\/ \u9ed8\u8ba4\u9759\u2fb3<br \/>\n        volumeRatio(20) \/\/ \u9ed8\u8ba4\u2fb3\u91cf\u4e3a20%<br \/>\n    {<br \/>\n        \/\/&#8230;<\/p>\n<p>        \/\/ \u5173\u8054\u9759\u2fb3\u6309\u94ae\u7684\u4fe1\u53f7\u69fd<br \/>\n        connect(ui-&gt;silenceBtn, &amp;QPushButton::clicked, this,<br \/>\n            &amp;VolumeTool::onSilenceBtnClicked);<br \/>\n    }<br \/>\n    void VolumeTool::onSilenceBtnClicked()<br \/>\n    {<br \/>\n        isMuted &#061; !isMuted;<br \/>\n        if (isMuted)<br \/>\n        {<br \/>\n            ui-&gt;silenceBtn-&gt;setIcon(QIcon(&#034;:\/images\/silent.png&#034;));<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            ui-&gt;silenceBtn-&gt;setIcon(QIcon(&#034;:\/images\/volumn.png&#034;));<br \/>\n        }<br \/>\n        emit setSilence(isMuted);<br \/>\n    }<br \/>\n    \/\/ qqMusic.h \u4e2d\u65b0\u589e<br \/>\n    void setMusicSilence(bool isMuted);<br \/>\n    \/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\n    void QQMusic::setMusicSilence(bool isMuted)<br \/>\n    {<br \/>\n        player-&gt;setMuted(isMuted);<br \/>\n    }<br \/>\n    void QQMusic::connectSignalAndSlots()<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        \/\/ \u8bbe\u7f6e\u9759\u2fb3<br \/>\n        connect(volumeTool, &amp;VolumeTool::setSilence, this,<br \/>\n            &amp;QQMusic::setMusicSilence);<br \/>\n    } <\/p>\n<h4>d.\u9f20\u6807\u6309\u4e0b\u3001\u6eda\u52a8\u4ee5\u53ca\u91ca\u653e\u4e8b\u4ef6\u5904\u7406<\/h4>\n<p> \u5f53\u9f20\u6807\u5728\u6ed1\u7aff\u4e0a\u6309\u4e0b\u65f6&#xff0c;\u9700\u8981\u8bbe\u7f6esliderBtn\u548coutLine\u7684\u4f4d\u7f6e&#xff0c;\u5f53\u9f20\u6807\u5728\u6ed1\u7aff\u4e0a\u79fb\u52a8\u6216\u8005\u9f20\u6807\u62ac\u8d77\u65f6&#xff0c;\u9700\u8981\u8bbe\u7f6eSliderBtnoutLine\u7ed3\u675f\u7684\u4f4d\u7f6e&#xff0c;\u5373\u6539\u53d8VolumeTool\u4e2d\u6ed1\u7aff\u7684\u663e\u793a\u3002\u5177\u4f53\u4fee\u6539\u64ad\u653e\u5a92\u4f53\u97f3\u91cf\u5927\u5c0f\u64cd\u4f5c\u5e94\u8be5\u7531\u4e8eQQMusic\u8d1f\u8d23\u5904\u7406&#xff0c;\u56e0\u6b64\u5f53\u9f20\u6807\u79fb\u52a8\u6216\u91ca\u653e\u65f6&#xff0c;\u9700\u8981\u53d1\u5c04\u4fe1\u53f7\u8ba9QQMusic\u77e5\u9053\u9700\u8981\u4fee\u6539\u64ad\u653e\u5a92\u4f53\u7684\u97f3\u91cf\u5927\u5c0f\u4e86\u3002<\/p>\n<p> \/\/ volumetool.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u53d1\u5c04\u4fee\u6539\u2fb3\u91cf\u2f24\u2f29\u69fd\u51fd\u6570<br \/>\nvoid setMusicVolume(int);<br \/>\n\/\/ \u4e8b\u4ef6\u8fc7\u6ee4\u5668<br \/>\nbool eventFilter(QObject* object, QEvent* event);<br \/>\n\/\/ volumetool.cpp \u4e2d\u65b0\u589e<\/p>\n<p>bool VolumeTool::eventFilter(QObject * object, QEvent * event)<br \/>\n{<br \/>\n    \/\/ \u8fc7\u6ee4volumeBox\u4e0a\u7684\u4e8b\u4ef6<br \/>\n    if (object &#061;&#061; ui-&gt;volumeBox)<br \/>\n    {<br \/>\n        if (event-&gt;type() &#061;&#061; QEvent::MouseButtonPress)<br \/>\n        {<br \/>\n            \/\/ \u5982\u679c\u662f\u2fcf\u6807\u6309\u4e0b\u4e8b\u4ef6&#xff0c;\u4fee\u6539sliderBtn\u548coutLine\u7684\u4f4d\u7f6e&#xff0c;\u5e76\u8ba1\u7b97<br \/>\n            volumeRation<br \/>\n                setVolume();<br \/>\n        }<br \/>\n        else if (event-&gt;type() &#061;&#061; QEvent::MouseMove)<br \/>\n        {<br \/>\n            \/\/ \u5982\u679c\u662f\u2fcf\u6807\u6eda\u52a8\u4e8b\u4ef6&#xff0c;\u4fee\u6539sliderBtn\u548coutLine\u7684\u4f4d\u7f6e&#xff0c;\u5e76\u8ba1\u7b97<br \/>\n            volumeRation&#xff0c;<br \/>\n                setVolume();<br \/>\n            \/\/ \u5e76\u53d1\u5c04setMusicVolume\u4fe1\u53f7<br \/>\n            emit setMusicVolume(volumeRatio);<br \/>\n        }<br \/>\n        else if (event-&gt;type() &#061;&#061; QEvent::MouseButtonRelease)<br \/>\n        {<br \/>\n            \/\/ \u5982\u679c\u662f\u2fcf\u6807\u91ca\u653e\u4e8b\u4ef6&#xff0c;\u76f4\u63a5\u53d1\u5c04setMusicVolume\u4fe1\u53f7<br \/>\n            emit setMusicVolume(volumeRatio);<br \/>\n        }<\/p>\n<p>        return true;<br \/>\n    }<\/p>\n<p>    return QObject::eventFilter(object, event);<br \/>\n}<br \/>\nVolumeTool::VolumeTool(QWidget* parent) :<br \/>\n    QWidget(parent),<br \/>\n    ui(new Ui::VolumeTool),<br \/>\n    isMuted(false),<br \/>\n    volumeRatio(20)<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u5b89\u88c5\u4e8b\u4ef6\u8fc7\u6ee4\u5668<br \/>\n    ui-&gt;volumeBox-&gt;installEventFilter(this);<br \/>\n} <\/p>\n<h4>e.outLine\u548cSliderBtn\u4ee5\u53cavolumeRation\u66f4\u65b0\u00a0<\/h4>\n<p>\/\/ volumetool.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u6839\u636e\u2fcf\u6807\u5728\u6ed1\u7aff\u4e0a\u6ed1\u52a8\u66f4\u65b0\u6ed1\u52a8\u754c\u2faf&#xff0c;\u5e76\u6309\u7167\u2f50\u4f8b\u8ba1\u7b97\u2fb3\u91cf\u2f24\u2f29<br \/>\nvoid setVolume();<br \/>\n\/\/ volumetool.cpp \u4e2d\u65b0\u589e<br \/>\nvoid VolumeTool::setVolume()<br \/>\n{<br \/>\n    \/\/ 1. \u5c06\u2fcf\u6807\u7684\u4f4d\u7f6e\u8f6c\u6362\u4e3asloderBox\u4e0a\u7684\u76f8\u5bf9\u5750\u6807&#xff0c;\u6b64\u5904\u53ea\u8981\u83b7\u53d6y\u5750\u6807<br \/>\n    int height &#061; ui-&gt;volumeBox-&gt;mapFromGlobal(QCursor().pos()).y();<br \/>\n    \/\/ 2. \u2fcf\u6807\u5728volumeBox\u4e2d\u53ef\u79fb\u52a8\u7684y\u8303\u56f4\u5728[25, 205\u4e4b\u95f4]<br \/>\n    height &#061; height &lt; 25 ? 25 : height;<br \/>\n    height &#061; height &gt; 205 ? 205 : height;<br \/>\n    \/\/ 3. \u8c03\u6574sloderBt\u7684\u4f4d\u7f6e<br \/>\n    ui-&gt;silderBtn-&gt;move(ui-&gt;silderBtn-&gt;x(), height &#8211; ui-&gt;silderBtn -&gt; height() \/ 2);<br \/>\n    \/\/ 4. \u66f4\u65b0outline\u7684\u4f4d\u7f6e\u548c\u2f24\u2f29<br \/>\n    ui-&gt;outLine-&gt;setGeometry(ui-&gt;outLine-&gt;x(), height, ui-&gt;outLine-&gt;width(),205 &#8211; height);<br \/>\n    \/\/ 5. \u8ba1\u7b97\u2fb3\u91cf\u2f50\u7387<br \/>\n    volumeRatio &#061; (int)((int)ui-&gt;outLine-&gt;height() \/ (float)180 * 100);<br \/>\n    \/\/ 6. \u8bbe\u7f6e\u7ed9label\u663e\u2f70\u51fa\u6765<br \/>\n    ui-&gt;volumeRatio-&gt;setText(QString::number(volumeRatio) &#043; &#034;%&#034;);<br \/>\n} <\/p>\n<h4>f.QQMusic\u7c7b\u62e6\u622aVolumeTool\u53d1\u5c04\u7684setMusicVolume\u4fe1\u53f7&#xff0c;\u5c06\u97f3\u91cf\u5927\u5c0f\u8bbe\u7f6e\u4e3a\u6307\u5b9a\u503c\u3002<\/h4>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\nvoid setPlayerVolume(int vomume); \/\/ \u8bbe\u7f6e\u2fb3\u91cf\u2f24\u2f29<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::setPlayerVolume(int volume)<br \/>\n{<br \/>\n    player-&gt;setVolume(volume);<br \/>\n}<br \/>\nvoid QQMusic::connectSignalAndSlots()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u8bbe\u7f6e\u2fb3\u91cf\u2f24\u2f29<br \/>\n    connect(volumeTool, &amp;VolumeTool::setMusicVolume, this,<br \/>\n        &amp;QQMusic::setPlayerVolume);<br \/>\n} <\/p>\n<h3>9\u3001\u5f53\u524d\u64ad\u653e\u65f6\u95f4\u548c\u603b\u65f6\u95f4\u66f4\u65b0<\/h3>\n<h4>a\u3001\u754c\u9762\u6b4c\u66f2\u603b\u65f6\u95f4\u66f4\u65b0<\/h4>\n<p>\u6b4c\u66f2\u603b\u65f6\u95f4\u5728Music\u5bf9\u8c61\u4e2d\u53ef\u4ee5\u83b7\u53d6&#xff0c;\u4e5f\u53ef\u4ee5\u8ba9player\u8c03\u7528\u81ea\u5df1\u7684duration()\u65b9\u6cd5\u83b7\u53d6\u3002\u4f46\u662f\u8fd9\u4e24\u79cd \u83b7\u53d6\u6b4c\u66f2\u603b\u65f6\u95f4\u7684\u8c03\u7528\u65f6\u673a\u4e0d\u592a\u597d\u786e\u5b9a\u3002\u6211\u4eec\u671f\u671b\u7684\u662f\u5f53\u6b4c\u66f2\u53d1\u751f\u5207\u6362\u65f6&#xff0c;\u83b7\u53d6\u5230\u6b63\u5728\u64ad\u653e\u6b4c\u66f2\u7684 \u603b\u65f6\u957f\u3002\u5f53\u64ad\u653e\u6e90\u7684\u6301\u7eed\u65f6\u957f\u53d1\u751f\u6539\u53d8\u65f6&#xff0c;QMediaPlayer\u4f1a\u89e6\u53d1durationChanged\u4fe1\u53f7&#xff0c;\u8be5\u4fe1\u53f7\u4e2d\u63d0\u4f9b\u4e86\u5c06\u8981\u64ad\u653e\u5a92\u4f53\u7684\u603b\u65f6\u957f\u3002\u56e0\u6b64\u5728QQMusic\u7c7b\u4e2d\u7ed9\u8be5\u4fe1\u53f7\u5173\u8054\u69fd\u51fd\u6570&#xff0c;\u5728\u69fd\u51fd\u6570\u4e2d\u5c06duration\u66f4\u65b0\u5230\u754c\u9762\u603b\u65f6\u95f4\u5373\u53ef\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u6b4c\u66f2\u6301\u7eed\u65f6\u2ed3\u6539\u53d8\u65f6[\u6b4c\u66f2\u5207\u6362]<br \/>\nvoid onDurationChanged(qint64 duration);<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onDurationChanged(qint64 duration)<br \/>\n{<br \/>\n    ui-&gt;totalTime-&gt;setText(QString(&#034;%1:%2&#034;).arg(duration \/ 1000 \/ 60, 2, 10,<br \/>\n        QChar(&#039;0&#039;))<br \/>\n        .arg(duration \/ 1000 % 60, 2, 10,<br \/>\n            QChar(&#039;0&#039;)));<br \/>\n}<br \/>\nvoid QQMusic::initPlayer()<br \/>\n{<br \/>\n    \/\/ &#8230;.<br \/>\n    \/\/ \u5a92\u4f53\u6301\u7eed\u65f6\u2ed3\u66f4\u65b0&#xff0c;\u5373&#xff1a;\u2fb3\u4e50\u5207\u6362&#xff0c;\u65f6\u2ed3\u66f4\u65b0&#xff0c;\u754c\u2faf\u4e0a\u65f6\u95f4\u4e5f\u8981\u66f4\u65b0<br \/>\n    connect(player, &amp;QMediaPlayer::durationChanged, this,<br \/>\n        &amp;QQMusic::onDurationChanged);<br \/>\n} <\/p>\n<h4>b\u3001\u754c\u9762\u6b4c\u66f2\u5f53\u524d\u64ad\u653e\u65f6\u95f4\u66f4\u65b0<\/h4>\n<p>\u5a92\u4f53\u5728\u6301\u7eed\u64ad\u653e\u8fc7\u7a0b\u4e2d&#xff0c;QMediaPlayer\u4f1a\u53d1\u5c04positionChanged&#xff0c;\u8be5\u4fe1\u53f7\u5e26\u6709\u4e00\u4e2aqint64\u7c7b\u578b\u53c2 \u6570&#xff0c;\u8868\u793a\u5a92\u4f53\u5f53\u524d\u6301\u7eed\u64ad\u653e\u7684\u65f6\u95f4\u3002\u56e0\u6b64&#xff0c;\u5728QQMusic\u4e2d\u6355\u83b7\u8be5\u4fe1\u53f7&#xff0c;\u4fbf\u53ef\u83b7\u53d6\u5230\u6b63\u5728\u64ad\u653e\u5a92\u4f53\u7684\u6301\u7eed\u65f6\u95f4\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u64ad\u653e\u4f4d\u7f6e\u6539\u53d8&#xff0c;\u5373\u6301\u7eed\u64ad\u653e\u65f6\u95f4\u6539\u53d8<br \/>\nvoid onPositionChanged(qint64 duration);<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onPositionChanged(qint64 duration)<br \/>\n{<br \/>\n    ui-&gt;currentTime-&gt;setText(QString(&#034;%1:%2&#034;).arg(duration \/ 1000 \/ 60, 2, 10,<br \/>\n        QChar(&#039;0&#039;))<br \/>\n        .arg(duration \/ 1000 % 60, 2, 10,<br \/>\n            QChar(&#039;0&#039;)));<\/p>\n<p>    \/\/ \u754c\u2faf\u4e0a\u7684\u8fdb\u5ea6\u6761\u4e5f\u9700\u8981\u540c\u6b65\u4fee\u6539<br \/>\n}<br \/>\nvoid QQMusic::initPlayer()<br \/>\n{<br \/>\n    \/\/ &#8230;.<br \/>\n    \/\/ \u64ad\u653e\u4f4d\u7f6e\u53d1\u2f63\u6539\u53d8&#xff0c;\u5373\u5df2\u7ecf\u64ad\u653e\u65f6\u95f4\u66f4\u65b0<br \/>\n    connect(player, &amp;QMediaPlayer::positionChanged, this,<br \/>\n        &amp;QQMusic::onPositionChanged);<br \/>\n} <\/p>\n<h3>10\u3001\u8fdb\u5ea6\u6761\u5904\u7406<\/h3>\n<h4>a\u3001seek\u529f\u80fd\u4ecb\u7ecd<\/h4>\n<p>\u64ad\u653e\u5668\u7684seek\u529f\u80fd\u6307&#xff0c;\u901a\u8fc7\u65f6\u95f4\u6216\u4f4d\u7f6e\u5feb\u901f\u5b9a\u4f4d\u5230\u89c6\u9891\u6216\u97f3\u9891\u6d41\u7684\u7279\u5b9a\u4f4d\u7f6e&#xff0c;\u5141\u8bb8\u7528\u6237\u5728\u64ad\u653e\u8fc7\u7a0b\u4e2d\u968f\u65f6\u8df3\u8f6c\u5230\u7279\u5b9a\u65f6\u95f4\u70b9&#xff0c;\u4ece\u800c\u5feb\u901f\u627e\u5230\u611f\u5174\u8da3\u7684\u5185\u5bb9\u6216\u91cd\u65b0\u5f00\u59cb\u64ad\u653e\u3002<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"168\" src=\"2025-04-29y1a0tw3kg1p.png\" width=\"372\" \/><\/p>\n<h4>b\u3001\u8fdb\u5ea6\u6761\u754c\u9762\u663e\u793a\u00a0<\/h4>\n<p>\u8fdb\u5ea6\u6761\u529f\u80fd\u8fdb\u5ea6\u754c\u9762\u5c55\u793a\u4e0e\u97f3\u91cf\u8c03\u8282\u4f4d\u7f6e\u7c7b\u4f3c&#xff0c;\u62e6\u622a\u9f20\u6807\u6309\u4e0b\u3001\u9f20\u6807\u79fb\u52a8\u3001\u4ee5\u53ca\u9f20\u6807\u91ca\u653e\u6d88\u606f\u5373\u53ef\u3002\u5728\u5185\u90e8\u6355\u83b7\u5230\u9f20\u6807\u7684\u4f4d\u7f6e\u7684\u6a2a\u5750\u6807x&#xff0c;\u5c06x\u4f5c\u4e3aoutLine\u7684\u5bbd\u5ea6\u5373\u53ef\u3002\u5373\u5728\u9f20\u6807\u6309\u4e0b\u3001\u79fb\u52a8\u3001\u91ca\u653e\u7684\u65f6\u5019&#xff0c;\u4fee\u6539outLine\u7684\u5bbd\u5ea6\u5373\u53ef\u3002<\/p>\n<p>\/\/ musicslider.h \u4e2d\u65b0\u589e<br \/>\nvoid mousePressEvent(QMouseEvent * event); \/\/ \u91cd\u5199\u2fcf\u6807\u6309\u4e0b\u4e8b\u4ef6<br \/>\nvoid mouseMoveEvent(QMouseEvent * event); \/\/ \u91cd\u5199\u2fcf\u6807\u6eda\u52a8\u4e8b\u4ef6<br \/>\nvoid mouseReleaseEvent(QMouseEvent * event); \/\/ \u91cd\u5199\u2fcf\u6807\u91ca\u653e\u4e8b\u4ef6<br \/>\nvoid moveSilder(); \/\/ \u4fee\u6539outLine\u7684\u5bbd\u5ea6\u4e3acurrentPos<\/p>\n<p> private:<br \/>\n     int currentPos; \/\/ \u6ed1\u52a8\u6761\u5f53\u524d\u4f4d\u7f6e<\/p>\n<p>        \/\/ musicslider.cpp \u4e2d\u65b0\u589e<br \/>\n        MusicSlider::MusicSlider(QWidget * parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::MusicSlider)<br \/>\n    {<br \/>\n        ui-&gt;setupUi(this);<br \/>\n        \/\/ \u521d\u59cb\u60c5\u51b5\u4e0b&#xff0c;\u8fd8\u6ca1\u6709\u5f00\u59cb\u64ad\u653e&#xff0c;\u5c06\u5f53\u524d\u64ad\u653e\u8fdb\u5ea6\u8bbe\u7f6e\u4e3a0<br \/>\n        currentPos &#061; 0;<br \/>\n        maxWidth &#061; width();<br \/>\n        moveSilder();<br \/>\n    }<br \/>\n    void MusicSlider::mousePressEvent(QMouseEvent* event)<br \/>\n    {<br \/>\n        \/\/ \u6ce8\u610f&#xff1a;QMouseEvent\u4e2d\u7684pos()\u4e3a\u2fcf\u6807\u76f8\u5bf9\u4e8ewidget\u7684\u5750\u6807&#xff0c;\u4e0d\u662f\u76f8\u5f53\u4e8escreen<br \/>\n        \/\/ \u56e0\u6b64\u2fcf\u6807\u4f4d\u7f6e\u7684 x \u5750\u6807\u53ef\u76f4\u63a5\u4f5c\u4e3aoutLine\u7684\u5bbd\u5ea6<br \/>\n        currentPos &#061; event-&gt;pos().x();<br \/>\n        moveSilder();<br \/>\n    }<br \/>\n    void MusicSlider::mouseMoveEvent(QMouseEvent* event)<br \/>\n    {<br \/>\n        \/\/ \u5982\u679c\u2fcf\u6807\u4e0d\u5728MusicSlider\u7684\u77e9\u5f62\u5185&#xff0c;\u4e0d\u8fdb\u2f8f\u62d6\u62fd<br \/>\n        QRect rect &#061; QRect(0, 0, width(), height());<br \/>\n        QPoint pos &#061; event-&gt;pos();<br \/>\n        if (!rect.contains(pos))<br \/>\n        {<br \/>\n            return;<br \/>\n        }<br \/>\n        \/\/ \u6839\u636e\u2fcf\u6807\u6ed1\u52a8\u7684\u4f4d\u7f6e\u66f4\u65b0outLine\u7684\u5bbd\u5ea6<br \/>\n        if (event-&gt;buttons() &#061;&#061; Qt::LeftButton)<br \/>\n        {<br \/>\n            \/\/ \u9a8c\u8bc1&#xff1a;\u2fcf\u6807\u70b9\u51fb\u7684x\u5750\u6807\u662f\u5426\u8d8a\u754c&#xff0c;\u5982\u679c\u8d8a\u754c\u5c06\u5176\u8c03\u6574\u5230\u8fb9\u754c<br \/>\n            currentPos &#061; event-&gt;pos().x();<br \/>\n            if (currentPos &lt; 0)<br \/>\n            {<br \/>\n                currentPos &#061; 0;<br \/>\n            }<br \/>\n            if (currentPos &gt; maxWidth)<br \/>\n            {<br \/>\n                currentPos &#061; maxWidth;<br \/>\n            }<\/p>\n<p>                moveSilder();<br \/>\n        }<br \/>\n    }<br \/>\n    void MusicSlider::mouseReleaseEvent(QMouseEvent* event)<br \/>\n    {<br \/>\n        currentPos &#061; event-&gt;pos().x();<br \/>\n        moveSilder();<br \/>\n    }<br \/>\n    void MusicSlider::moveSilder()<br \/>\n    {<br \/>\n        \/\/ \u6839\u636e\u5f53\u524d\u8fdb\u5ea6\u8bbe\u7f6e\u5916\u90e8\u6ed1\u52a8\u6761\u7684\u4f4d\u7f6e<br \/>\n        ui-&gt;outLine-&gt;setMaximumWidth(currentPos);<br \/>\n        ui-&gt;outLine-&gt;setGeometry(0, 8, currentPos, 4);<br \/>\n    } <\/p>\n<h4>c\u3001\u8fdb\u5ea6\u6761\u540c\u6b65\u6301\u7eed\u64ad\u653e\u65f6\u95f4<\/h4>\n<p>\u5f53\u9f20\u6807\u91ca\u653e\u4e4b\u540e&#xff0c;\u8ba1\u7b97\u51fa\u8fdb\u5ea6\u6761\u5f53\u524d\u4f4d\u7f6ecurrentPos\u548c\u603b\u5bbd\u5ea6\u7684maxWidth\u6bd4\u7387&#xff0c;\u7136\u540e\u53d1\u5c04\u4fe1\u53f7\u544a\u8bc9QQMusic&#xff0c;\u8ba9player\u6309\u7167\u8be5\u6bd4\u7387\u66f4\u65b0\u6301\u7eed\u64ad\u653e\u65f6\u95f4\u3002<\/p>\n<p>\/\/ musicslider.h \u65b0\u589e<br \/>\nsignals:<br \/>\n    void setMusicSliderPosition(float);<br \/>\n    \/\/ musicslider.cpp \u4e2d\u65b0\u589e<br \/>\n    void MusicSlider::mouseReleaseEvent(QMouseEvent* event)<br \/>\n    {<br \/>\n        currentPos &#061; event-&gt;pos().x();<br \/>\n        moveSilder();<br \/>\n        emit setMusicSliderPosition((float)currentPos \/ (float)maxWidth);<br \/>\n    }<br \/>\n    \/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n    void onMusicSliderChanged(float value); \/\/ \u8fdb\u5ea6\u6761\u6539\u53d8<br \/>\n    \/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\n    void QQMusic::onMusicSliderChanged(float value)<br \/>\n    {<br \/>\n        \/\/ 1. \u8ba1\u7b97\u5f53\u524dseek\u4f4d\u7f6e\u7684\u65f6\u2ed3<br \/>\n        qint64 duration &#061; (qint64)(totalDuration * value);<\/p>\n<p>            \/\/ 2. \u8f6c\u6362\u4e3a\u767e\u5206\u5236&#xff0c;\u8bbe\u7f6e\u5f53\u524d\u65f6\u95f4<br \/>\n            ui-&gt;currentTime-&gt;setText(QString(&#034;%1:%2&#034;).arg(duration \/ 1000 \/ 60, 2, 10,<br \/>\n                QChar(&#039;0&#039;))<br \/>\n                .arg(duration \/ 1000 % 60, 2, 10,<br \/>\n                    QChar(&#039;0&#039;)));<br \/>\n        \/\/ 3. \u8bbe\u7f6e\u5f53\u524d\u64ad\u653e\u4f4d\u7f6e<br \/>\n        player-&gt;setPosition(duration);<br \/>\n    }<br \/>\n    void QQMusic::connectSignalAndSlots()<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        \/\/ \u8fdb\u5ea6\u6761\u62d6\u62fd<br \/>\n        connect(ui-&gt;progressBar, &amp;MusicSlider::setMusicSliderPosition, this,<br \/>\n            &amp;QQMusic::onMusicSliderChanged);<br \/>\n    } <\/p>\n<h4>d\u3001\u6301\u7eed\u65f6\u95f4\u540c\u6b65\u8fdb\u5ea6\u6761<\/h4>\n<p>\u5f53\u64ad\u653e\u4f4d\u7f6e\u66f4\u65b0\u65f6&#xff0c;\u754c\u9762\u4e0a\u6301\u7eed\u64ad\u653e\u65f6\u95f4\u4e00\u76f4\u5728\u66f4\u65b0&#xff0c;\u56e0\u6b64\u8fdb\u5ea6\u6761\u4e5f\u9700\u8981\u6301\u7eed\u5411\u524d\u8fdb\u3002MusicSlider\u5e94\u8be5\u63d0\u4f9bsetStep\u51fd\u6570&#xff0c;\u64ad\u653e\u8fdb\u5ea6\u6301\u7eed\u66f4\u65b0\u65f6&#xff0c;\u4e5f\u5c06\u8fdb\u5ea6\u6761\u901a\u8fc7setStep\u51fd\u6570\u66f4\u65b0\u4e0b\u3002<\/p>\n<p>\/\/ musicslider.h \u4e2d\u65b0\u589e<br \/>\nvoid setStep(float bf);<br \/>\n\/\/ musicslider.cpp \u4e2d\u65b0\u589e<br \/>\nvoid MusicSlider::setStep(float bf)<br \/>\n{<br \/>\n    currentPos &#061; maxWidth * bf;<br \/>\n    moveSilder();<br \/>\n}<br \/>\n\/\/ qqmusic.cpp \u4e2d\u4fee\u6539<br \/>\nvoid QQMusic::onPositionChanged(qint64 duration)<br \/>\n{<br \/>\n    \/\/ 1. \u66f4\u65b0\u5df2\u7ecf\u64ad\u653e\u65f6\u95f4<br \/>\n    ui-&gt;currentTime-&gt;setText(QString(&#034;%1:%2&#034;).arg(duration \/ 1000 \/ 60, 2, 10,<br \/>\n        QChar(&#039;0&#039;))<br \/>\n        .arg(duration \/ 1000 % 60, 2, 10,<br \/>\n            QChar(&#039;0&#039;)));<br \/>\n    \/\/ 2. \u8fdb\u5ea6\u6761\u5904\u7406<\/p>\n<p>        ui-&gt;progressBar-&gt;setStep((float)duration \/ (float)totalDuration);<br \/>\n} <\/p>\n<h4>\u00a0e\u3001\u6b4c\u66f2\u540d\u3001\u6b4c\u624b\u548c\u5c01\u9762\u65f6\u95f4\u540c\u6b65<\/h4>\n<p>\u5728\u8fdb\u884c\u6b4c\u66f2\u5207\u6362\u65f6\u5019&#xff0c;\u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u624b\u4ee5\u53ca\u6b4c\u66f2\u7684\u5c01\u9762\u56fe&#xff0c;\u4e5f\u9700\u8981\u66f4\u65b0\u5230\u754c\u9762\u3002\u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u624b\u53ef\u4ee5\u518dMusic\u5bf9\u8c61\u4e2d\u8fdb\u884c\u83b7\u53d6&#xff0c;\u6b4c\u66f2\u7684\u5c01\u9762\u56fe\u53ef\u4ee5\u901a\u8fc7player\u5230\u6b4c\u66f2\u7684\u5143\u6570\u636e\u4e2d\u83b7\u53d6&#xff0c;\u83b7\u53d6\u65f6\u9700\u8981\u4f7f \u7528&#034;Thumbnaillmage&#034;\u4f5c\u4e3a\u53c2\u6570&#xff0c;\u6ce8\u610f\u6709\u4e9b\u6b4c\u66f2\u53ef\u80fd\u6ca1\u6709\u5c01\u9762\u56fe&#xff0c;\u5982\u679c\u6ca1\u6709\u8bbe\u7f6e\u4e00\u5f20\u9ed8\u8ba4\u7684\u5c01\u9762\u56fe\u3002 \u7531\u4e8e\u6b4c\u66f2\u5207\u6362\u65f6&#xff0c;player\u9700\u8981\u5c06\u65b0\u64ad\u653e\u6b4c\u66f2\u4f5c\u4e3a\u64ad\u653e\u6e90&#xff0c;\u5e76\u89e3\u6790\u6b4c\u66f2\u6587\u4ef6&#xff0c;\u5982\u679c\u6b4c\u66f2\u6587\u4ef6\u662f\u6709\u6548\u7684\u624d\u80fd\u64ad\u653e;\u56e0\u6b64QQMusic\u7c7b\u53ef\u4ee5\u7ed9QMediaPlayer\u53d1\u5c04\u7684metaDataAvailableChanged(bool))\u4fe1 \u53f7\u5173\u8054\u69fd\u51fd\u6570&#xff0c;\u5f53\u6b4c\u66f2\u66f4\u6362\u65f6&#xff0c;\u5b8c\u6210\u4fe1\u606f\u7684\u66f4\u65b0\u3002<\/p>\n<p>\/\/ qqmusic.h\u4e2d\u65b0\u589e<br \/>\nvoid onMetaDataAvailableChangedChanged(bool available)<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::onMetaDataAvailableChangedChanged(bool available)<br \/>\n{<br \/>\n    \/\/ \u64ad\u653e\u6e90\u6539\u53d8<br \/>\n    qDebug() &lt;&lt; &#034;\u6b4c\u66f2\u5207\u6362&#034;;<br \/>\n    \/\/ 1. \u4eceplayer\u64ad\u653e\u6b4c\u66f2\u7684\u5143\u6570\u636e\u4e2d\u83b7\u53d6\u6b4c\u66f2\u4fe1\u606f<br \/>\n    QString singer &#061; player-&gt;metaData(&#034;Author&#034;).toStringList().join(&#034;,&#034;);<br \/>\n    QString musicName &#061; player-&gt;metaData(&#034;Title&#034;).toString();<br \/>\n    if (musicName.isEmpty())<br \/>\n    {<br \/>\n        auto it &#061; musicList.findMusicByMusicId(currentPage &#8211;<br \/>\n&gt; getMusicIdByIndex(curPlayMusicIndex));<br \/>\n        if (it !&#061; musicList.end())<br \/>\n        {<br \/>\n            musicName &#061; it-&gt;getMusicName();<br \/>\n            singer &#061; it-&gt;getMusicSinger();<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ 2. \u8bbe\u7f6e\u6b4c\u2f3f\u3001\u6b4c\u66f2\u540d\u79f0\u3001\u4e13\u8f91\u540d\u79f0<br \/>\n    ui-&gt;musicName-&gt;setText(musicName);<br \/>\n    ui-&gt;musicSinger-&gt;setText(singer);<\/p>\n<p>        \/\/ 3. \u83b7\u53d6\u5c01\u2faf\u56fe\u2f5a<br \/>\n        QVariant coverImage &#061; player-&gt;metaData(&#034;ThumbnailImage&#034;);<br \/>\n    if (coverImage.isValid())<br \/>\n    {<br \/>\n        \/\/ \u83b7\u53d6\u5c01\u2faf\u56fe\u2f5a\u6210\u529f<br \/>\n        QImage image &#061; coverImage.value&lt;QImage&gt;();<br \/>\n        \/\/ \u8bbe\u7f6e\u5c01\u2faf\u56fe\u2f5a<br \/>\n        ui-&gt;musicCover-&gt;setPixmap(QPixmap::fromImage(image));<br \/>\n        \/\/ \u7f29\u653e\u586b\u5145\u5230\u6574\u4e2aLabel<br \/>\n        ui-&gt;musicCover-&gt;setScaledContents(true);<br \/>\n        currentPage-&gt;setImageLabel(QPixmap::fromImage(image));<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        \/\/ \u8bbe\u7f6e\u9ed8\u8ba4\u56fe\u2f5a-\u4fee\u6539<br \/>\n        qDebug() &lt;&lt; &#034;\u6b4c\u66f2\u6ca1\u6709\u5c01\u2faf\u56fe\u2f5a&#034;;<br \/>\n    }<br \/>\n}<br \/>\nvoid CommonForm::setImageLabel(QPixmap pixMap)<br \/>\n{<br \/>\n    ui-&gt;musicImgLabel-&gt;setPixmap(pixMap);<br \/>\n    ui-&gt;musicImgLabel-&gt;setScaledContents(true);<br \/>\n} <\/p>\n<h2>Lrl\u6b4c\u8bcd\u540c\u6b65<\/h2>\n<h3>1\u3001\u754c\u9762\u5206\u6790<\/h3>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"276\" src=\"2025-04-29fmca5evcqyu.png\" width=\"430\" \/><\/p>\n<p>\u2460\u548c\u2461\u4e3aQLabel&#xff0c;\u5206\u522b\u663e\u793a\u4f5c\u8005\u548c\u6b4c\u66f2\u540d\u79f0; \u2462~\u2468\u5747\u4e3aQLabel&#xff0c;\u7528\u6765\u663e\u793a\u6b4c\u8bcd&#xff0c;\u2465\u4e3a\u5f53\u524d\u6b63\u5728\u64ad\u653e\u6b4c\u8bcd&#xff0c;\u2462\u2463\u2464\u4e3a\u5f53\u524d\u64ad\u653e\u6b4c\u8bcd\u7684\u524d\u4e09\u53e5&#xff0c;\u2466\u2467\u2468\u4e3a\u5f53\u524d\u64ad\u653e\u6b4c\u8bcd\u7684\u540e\u4e09\u53e5\u3002\u6b4c\u8bcd\u4f1a\u968f\u7740\u64ad\u653e\u65f6\u95f4\u6301\u7eed&#xff0c;\u4ece\u4e0b\u5f80\u4e0a\u79fb\u52a8\u3002 \u2460\u4e3a\u6309\u94ae&#xff0c;\u70b9\u51fb\u4e4b\u540e\u7a97\u53e3\u9690\u85cf\u3002\u00a0<\/p>\n<h3>2\u3001Lrc\u6b4c\u8bcd\u663e\u793a\u00a0<\/h3>\n<p>\u5728LrcPage\u7684\u6784\u9020\u51fd\u6570\u4e2d&#xff0c;\u5c06\u7a97\u53e3\u7684\u6807\u9898\u680f\u53bb\u9664\u6389&#xff1b;\u5e76\u7ed9hideBtn\u5173\u8054clicked\u4fe1\u53f7&#xff0c;\u5f53\u6309\u94ae\u70b9\u51fb\u65f6\u5c06\u7a97\u53e3\u9690\u85cf\u3002<\/p>\n<p>\/\/ lrcPage.cpp \u4e2d\u6dfb\u52a0<br \/>\nLyricsPage::LyricsPage(QWidget* parent) :<br \/>\n    QWidget(parent),<br \/>\n    ui(new Ui::LyricsPage)<br \/>\n{<br \/>\n    ui-&gt;setupUi(this);<br \/>\n    setWindowFlag(Qt::FramelessWindowHint);<br \/>\n    connect(ui-&gt;hideBtn, &amp;QPushButton::clicked, this, [&#061;] {<br \/>\n        hide();<br \/>\n        });<br \/>\n    ui-&gt;hideBtn-&gt;setIcon(QIcon(&#034;:\/images\/xiala.png&#034;));<br \/>\n} <\/p>\n<p>\u5728QQMusic\u4e2d&#xff0c;\u521b\u5efaLrcPage\u7684\u6307\u9488&#xff0c;\u5e76\u5728initUi)\u65b9\u6cd5\u4e2d\u521b\u5efa\u7a97\u53e3\u7684\u5bf9\u8c61&#xff0c;\u521b\u5efa\u597d\u4e4b\u540e\u5c06\u7a97\u53e3\u9690\u85cf\u8d77\u6765;\u5728QQMusic\u4e2d&#xff0c;\u7ed9IrcWord\u6309\u94ae\u6dfb\u52a0\u69fd\u51fd\u6570&#xff0c;\u5728\u69fd\u51fd\u6570\u4e2d\u5c06\u7a97\u53e3\u663e\u793a\u51fa\u6765\u3002<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u6dfb\u52a0<br \/>\n#include &#034;lrcpage.h&#034;<br \/>\nLrcPage* lrcPage;<br \/>\nvoid onLrcWordClicked();<br \/>\n\/\/ qqmusic.cpp \u4e2d\u6dfb\u52a0<br \/>\nvoid QQMusic::initUI()<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u521b\u5efalrc\u6b4c\u8bcd\u7a97\u2f1d<br \/>\n    lrcPage &#061; new LrcPage(this);<br \/>\n    lrcPage-&gt;hide();<br \/>\n}<br \/>\nvoid QQMusic::onLrcWordClicked()<br \/>\n{<\/p>\n<p>        lrcPage-&gt;show();<br \/>\n}<br \/>\nvoid QQMusic::connectSignalAndSlot()<br \/>\n{<br \/>\n    \/\/ &#8230;<\/p>\n<p>    \/\/ \u663e\u2f70\u6b4c\u8bcd\u7a97\u2f1d<br \/>\n    connect(ui-&gt;lrcWord, &amp;QPushButton::clicked, this,<br \/>\n        &amp;QQMusic::onLrcWordClicked);<br \/>\n} <\/p>\n<h3>3\u3001LcrPage\u6dfb\u52a0\u52a8\u753b\u6548\u679c<\/h3>\n<h4>a\u3001\u4e0a\u79fb\u52a8\u753b\u6548\u679c<\/h4>\n<p>\u2460QQMusic\u7684initUi\u51fd\u6570\u4e2d&#xff0c;\u521b\u5efaIrcPage\u5bf9\u8c61\u5e76\u5c06\u7a97\u53e3\u9690\u85cf;\u7ed9IrcPage\u7a97\u53e3\u6dfb\u52a0\u4e0a\u79fb\u52a8\u753b&#xff0c;\u52a8\u753b\u6682 \u4e0d\u5f00\u542f \u2461QQMusic\u4e2d\u7ed9&#034;\u6b4c\u8bcd&#034;\u6309\u94ae\u6dfb\u52a0\u69fd\u51fd\u6570&#xff0c;\u5f53\u6309\u94ae\u70b9\u51fb\u65f6&#xff0c;\u663e\u793a\u7a97\u53e3&#xff0c;\u5f00\u542f\u52a8\u753b<\/p>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n#include &lt;QPropertyAnimation&gt;<br \/>\n\/\/ \u6b4c\u8bcd\u6309\u94ae\u69fd\u51fd\u6570<br \/>\nvoid onLrcWordClicked();<br \/>\nprivate:<br \/>\n    QPropertyAnimation* lrcAnimation;<br \/>\n    \/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\n    void QQMusic::initUi()<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        \/\/ \u7a97\u2f1d\u6dfb\u52a0\u9634\u5f71\u6548\u679c<br \/>\n        QGraphicsDropShadowEffect* shadowEffect &#061; new<br \/>\n            QGraphicsDropShadowEffect(this);<br \/>\n        shadowEffect-&gt;setOffset(0, 0);<br \/>\n        shadowEffect-&gt;setColor(&#034;#000000&#034;); \/\/ \u2fca\u2f8a<br \/>\n        \/\/ \u6b64\u5904\u9700\u8981\u5c06\u5706\u2ec6\u534a\u5f84\u4e0d\u80fd\u592a\u2f24&#xff0c;\u5426\u5219\u52a8\u753b\u6548\u679c\u6709\u95ee\u9898&#xff0c;\u53ef\u4ee5\u8bbe\u7f6e\u4e3a10<br \/>\n        shadowEffect-&gt;setBlurRadius(20);<br \/>\n        this-&gt;setGraphicsEffect(shadowEffect);<\/p>\n<p>        \/\/ &#8230;<\/p>\n<p>            \/\/ \u5b9e\u4f8b\u5316LrcWord\u5bf9\u8c61<br \/>\n            lrcPage &#061; new LrcPage(this);<br \/>\n        lrcPage-&gt;hide();<\/p>\n<p>        \/\/ lrcPage\u6dfb\u52a0\u52a8\u753b\u6548\u679c<br \/>\n        lrcAnimation &#061; new QPropertyAnimation(lrcPage, &#034;geometry&#034;, this);<br \/>\n        lrcAnimation-&gt;setDuration(250);<br \/>\n        lrcAnimation-&gt;setStartValue(QRect(10, 10 &#043; lrcPage-&gt;height(),<br \/>\n            lrcPage-&gt;width(), lrcPage-&gt;height()));<br \/>\n        lrcAnimation-&gt;setEndValue(QRect(10, 10, lrcPage-&gt;width(), lrcPage -&gt; height()));<br \/>\n    }<br \/>\n    \/\/ \u663e\u2f70\u7a97\u2f1d \u5e76 \u5f00\u542f\u52a8\u753b<br \/>\n    void QQMusic::onLrcWordClicked()<br \/>\n    {<br \/>\n        lrcPage-&gt;show();<br \/>\n        lrcAnimation-&gt;start();<br \/>\n    }<br \/>\n    void QQMusic::connectSignalAndSlots()<br \/>\n    {<br \/>\n        \/\/ &#8230;<br \/>\n        \/\/ \u6b4c\u8bcd\u6309\u94ae\u70b9\u51fb\u4fe1\u53f7\u548c\u69fd\u51fd\u6570<br \/>\n        connect(ui-&gt;lrcWord, &amp;QPushButton::clicked, this,<br \/>\n            &amp;QQMusic::onLrcWordClicked);<br \/>\n        \/\/ &#8230; <\/p>\n<h4>b\u3001\u9690\u85cf\u7a97\u53e3\u548c\u4e0b\u79fb\u52a8\u753b<\/h4>\n<p>LrcPage\u7c7b\u4e2d&#xff0c;\u5728\u6784\u9020\u7a97\u53e3\u65f6\u8bbe\u7f6e\u4e0b\u79fb\u52a8\u753b&#xff0c;\u7ed9&#034;\u4e0b\u62c9&#034;\u6309\u94ae\u6dfb\u52a0\u69fd\u51fd\u6570&#xff0c;\u5f53&#034;\u4e0b\u62c9\u6309\u94ae&#034;\u70b9\u51fb\u65f6&#xff0c;\u5f00\u542f\u52a8\u753b&#xff1b;\u5f53\u52a8\u753b\u7ed3\u675f\u65f6&#xff0c;\u5c06\u7a97\u53e3\u9690\u85cf\u3002<\/p>\n<p>\/\/ lrcpage.h \u4e2d\u65b0\u589e<br \/>\n#include &lt;QPropertyAnimation&gt;<br \/>\nprivate:<br \/>\n    QPropertyAnimation* lrcAnimation;<br \/>\n    \/\/ lrcpage.cpp \u4e2d\u65b0\u589e<br \/>\n    LrcPage::LrcPage(QWidget* parent) :<br \/>\n        QWidget(parent),<br \/>\n        ui(new Ui::LrcPage)<\/p>\n<p>    {<br \/>\n        ui-&gt;setupUi(this);<\/p>\n<p>        \/\/ &#8230;<br \/>\n        lrcAnimation &#061; new QPropertyAnimation(this, &#034;geometry&#034;, this);<br \/>\n        lrcAnimation-&gt;setDuration(250);<br \/>\n        lrcAnimation-&gt;setStartValue(QRect(10, 10, width(), height()));<br \/>\n        lrcAnimation-&gt;setEndValue(QRect(10, 10 &#043; height(), width(), height()));<\/p>\n<p>        \/\/ \u70b9\u51fb\u8bbe\u7f6e\u4e0b\u62c9\u6309\u94ae\u65f6\u5f00\u542f\u52a8\u753b<br \/>\n        connect(ui-&gt;hideBtn, &amp;QPushButton::clicked, this, [&#061;] {<br \/>\n            lrcAnimation-&gt;start();<br \/>\n            });<\/p>\n<p>        \/\/ \u52a8\u753b\u7ed3\u675f\u65f6&#xff0c;\u5c06\u7a97\u2f1d\u9690\u85cf<br \/>\n        connect(lrcAnimation, &amp;QPropertyAnimation::finished, this, [&#061;] {<br \/>\n            hide();<br \/>\n            });<br \/>\n    } <\/p>\n<h3>4\u3001Lrc\u6b4c\u8bcd\u89e3\u6790\u548c\u540c\u6b65<\/h3>\n<p>\u6bcf\u9996\u6b4c\u7684Irc\u6b4c\u8bcd\u6709\u591a\u884c\u6587\u672c&#xff0c;\u56e0\u6b64Irc\u6b4c\u8bcd\u4e2d\u7684\u6bcf\u884c\u53ef\u4ee5\u91c7\u7528\u7ed3\u6784\u4f53\u7ba1\u7406\u3002<\/p>\n<p>\/\/ lrcpage.h \u4e2d\u65b0\u589e<br \/>\nstruct LyricLine<br \/>\n{<br \/>\n    qint64 time; \/\/ \u65f6\u95f4<br \/>\n    QString text; \/\/ \u6b4c\u8bcd\u5185\u5bb9<br \/>\n    LyricLine(qint64 qtime, QString qtext)<br \/>\n        : time(qtime)<br \/>\n        , text(qtext)<br \/>\n    {}<br \/>\n};<br \/>\n\/\/ LrcPage\u7c7b\u4e2d\u6dfb\u52a0\u6210\u5458\u53d8\u91cf<br \/>\nQVector&lt;LrcLine&gt; lrcLines; \/\/ \u6309\u7167\u65f6\u95f4\u7684\u5148\u540e\u6b21\u5e8f\u4fdd\u5b58\u6bcf\u2f8f\u6b4c\u8bcd <\/p>\n<h4>a\u3001\u901a\u8fc7\u6b4c\u540d\u627elrc\u6587\u4ef6<\/h4>\n<p>\u4e00\u822c\u60c5\u51b5\u4e0b&#xff0c;\u64ad\u653e\u5668\u5728\u8bbe\u8ba1\u4e4b\u521d\u5c31\u4f1a\u8bbe\u8ba1\u597d\u6b4c\u66f2\u6587\u4ef6\u548c\u6b4c\u8bcd\u6587\u4ef6\u7684\u5b58\u653e\u4f4d\u7f6e&#xff0c;\u4ee5\u53ca\u5bf9\u5e94\u5173\u7cfb&#xff0c;\u901a\u5e38\u6b4c\u66f2\u6587\u4ef6\u548cIrc\u6b4c\u8bcd\u6587\u4ef6\u540d\u5b57\u76f8\u540c&#xff0c;\u540e\u7f00\u4e0d\u540c\u3002\u5728\u78c1\u76d8\u5b58\u653e\u7684\u65f6\u5019&#xff0c;\u53ef\u4ee5\u5c06\u6b4c\u66f2\u6587\u4ef6\u548cIrc\u6587\u4ef6\u5206\u4e24\u4e2a\u6587\u4ef6\u5939\u5b58\u50a8&#xff0c;\u4e5f\u53ef\u4ee5\u5b58\u50a8\u5230\u4e00\u4e2a\u6587\u4ef6\u5939\u4e0b\u3002\u672c\u6587\u4e3a\u4e86\u65b9\u4fbf\u5904\u7406&#xff0c;\u5b58\u50a8\u5728\u4e00\u4e2a\u6587\u4ef6\u5939\u4e0b&#xff0c;\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7Music\u5bf9\u8c61\u5feb\u901f\u627e\u5230Irc\u6b4c\u8bcd\u6587\u4ef6\u3002<\/p>\n<p>\/\/ music.h \u4e2d\u65b0\u589e<br \/>\nQString getLrcFilePath() const;<br \/>\n\/\/ music.cpp \u4e2d\u65b0\u589e<br \/>\nQString Music::getLrcFilePath() const<br \/>\n{<br \/>\n    \/\/ \u2fb3\u9891\u2f42\u4ef6\u548cLRC\u2f42\u4ef6\u5728\u2f00\u4e2a\u2f42\u4ef6\u5939\u4e0b<br \/>\n    \/\/ \u76f4\u63a5\u5c06\u2fb3\u9891\u2f42\u4ef6\u7684\u540e\u7f00\u66ff\u6362\u4e3a.lrc<br \/>\n    QString path &#061; musicUrl.toLocalFile();<br \/>\n    path.replace(&#034;.mp3&#034;, &#034;.lrc&#034;);<br \/>\n    path.replace(&#034;.flac&#034;, &#034;.lrc&#034;);<br \/>\n    path.replace(&#034;.mpga&#034;, &#034;.lrc&#034;);<br \/>\n    return path;<br \/>\n} <\/p>\n<h4>b\u3001\u6b4c\u8bcd\u89e3\u6790<\/h4>\n<p>\u627e\u5230Irc\u6b4c\u8bcd\u6587\u4ef6\u540e&#xff0c;\u7531IrcPage\u7c7b\u5b8c\u6210\u5bf9\u6b4c\u8bcd\u7684\u89e3\u6790\u3002\u89e3\u6790\u7684\u5927\u6982\u6b65\u9aa4&#xff1a; \u2460\u6253\u5f00\u6b4c\u8bcd\u6587\u4ef6 \u2461\u4ee5\u884c\u4e3a\u5355\u4f4d&#xff0c;\u8bfb\u53d6\u6b4c\u8bcd\u6587\u4ef6\u4e2d\u7684\u6bcf\u4e00\u884c \u2462\u6309\u7167Irc\u6b4c\u8bcd\u6587\u4ef6\u683c\u5f0f&#xff0c;\u4ece\u6bcf\u884c\u6587\u672c\u4e2d\u89e3\u6790\u51fa\u65f6\u95f4\u548c\u6b4c\u8bcd [00:17.94]\u90a3\u4e9b\u5931\u7720\u7684\u4eba\u554a\u4f60\u4eec\u8fd8\u597d\u5417 [0:58.600.00]\u4f60\u50cf\u4e00\u53ea\u98de\u6765\u98de\u53bb\u7684\u8774\u8776 \u2463\u7528&lt;\u65f6\u95f4&#xff0c;\u884c\u6b4c\u8bcd&gt;\u6784\u5efa\u4e00\u4e2aLrcLine\u5bf9\u8c61\u5b58\u50a8\u5230IrcLines\u4e2d\u3002<\/p>\n<p>\/\/ lrcpage.h \u4e2d\u65b0\u589e<br \/>\nbool parseLrc(const QString&amp; lrcPath)&#xff1b;<br \/>\n\/\/ lrcpage.cpp \u4e2d\u65b0\u589e<br \/>\nbool LrcPage::parseLrc(const QString&amp; lrcPath)<br \/>\n{<\/p>\n<p>        lrcLines.clear();<br \/>\n    \/\/ \u6253\u5f00\u6b4c\u8bcd\u2f42\u4ef6<br \/>\n    QFile lrcFile(lrcPath);<br \/>\n    if (!lrcFile.open(QFile::ReadOnly))<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u6253\u5f00\u2f42\u4ef6:&#034; &lt;&lt; lrcPath;<br \/>\n        return false;<br \/>\n    }<br \/>\n    while (!lrcFile.atEnd())<br \/>\n    {<br \/>\n        QString lrcWord &#061; lrcFile.readLine(1024);<br \/>\n        \/\/ [00:17.94]\u90a3\u4e9b\u5931\u7720\u7684\u2f08\u554a \u4f60\u4eec\u8fd8\u597d\u5417<br \/>\n        \/\/ [0:58.600.00]\u4f60\u50cf\u2f00\u53ea\u2edc\u6765\u2edc\u53bb\u7684\u8774\u8776<br \/>\n        int left &#061; lrcWord.indexOf(&#039;[&#039;);<br \/>\n        int right &#061; lrcWord.indexOf(&#039;]&#039;);<br \/>\n        \/\/ \u89e3\u6790\u65f6\u95f4<br \/>\n        qint64 lineTime &#061; 0;<br \/>\n        int start &#061; 0;<br \/>\n        int end &#061; 0;<br \/>\n        QString time &#061; lrcWord.mid(left, right &#8211; left &#043; 1);<br \/>\n        \/\/ \u89e3\u6790\u5206\u949f<br \/>\n        start &#061; 1;<br \/>\n        end &#061; time.indexOf(&#039;:&#039;);<br \/>\n        lineTime &#043;&#061; lrcWord.mid(start, end &#8211; start).toInt() * 60 * 1000;<br \/>\n        \/\/ \u89e3\u6790\u79d2<br \/>\n        start &#061; end &#043; 1;<br \/>\n        end &#061; time.indexOf(&#039;.&#039;, start);<br \/>\n        lineTime &#043;&#061; lrcWord.mid(start, end &#8211; start).toInt() * 1000;<br \/>\n        \/\/ \u89e3\u6790\u6beb\u79d2<br \/>\n        start &#061; end &#043; 1;<br \/>\n        end &#061; time.indexOf(&#039;.&#039;, start);<br \/>\n        lineTime &#043;&#061; lrcWord.mid(start, end &#8211; start).toInt();<br \/>\n        \/\/ \u89e3\u6790\u6b4c\u8bcd<br \/>\n        QString word &#061; lrcWord.mid(right &#043; 1).trimmed();<br \/>\n        lrcLines.push_back(LrcLine(lineTime, word.trimmed()));<br \/>\n    }<br \/>\n    \/\/ \u6d4b\u8bd5\u9a8c\u8bc1<\/p>\n<p>        for (auto word : lrcLines)<br \/>\n        {<br \/>\n            qDebug() &lt;&lt; word.time &lt;&lt; &#034; &#034; &lt;&lt; word.text;<br \/>\n        }<br \/>\n    return true;<br \/>\n} <\/p>\n<h4>c\u3001\u6839\u636e\u6b4c\u66f2\u64ad\u653e\u4f4d\u7f6e\u83b7\u53d6\u6b4c\u8bcd\u5e76\u663e\u793a<\/h4>\n<p>\u5f53\u6b4c\u66f2\u64ad\u653e\u8fdb\u5ea6\u6539\u53d8\u65f6\u5019&#xff0c;QMediaPlayer\u7684positionChanged\u4fe1\u53f7\u4f1a\u89e6\u53d1&#xff0c;\u8be5\u4fe1\u53f7\u540c\u6b65\u64ad\u653e\u65f6\u95f4\u7684\u65f6\u5019\u5df2\u7ecf\u5728QQMusic\u7c7b\u4e2d\u5904\u7406\u8fc7\u4e86&#xff0c;\u5728\u5176\u69fd\u51fd\u6570\u4e2d\u5c31\u80fd\u62ff\u5230\u5f53\u524d\u6b4c\u66f2\u7684\u64ad\u653e\u65f6\u95f4&#xff0c;\u901a\u8fc7\u64ad\u653e\u65f6\u95f4&#xff0c;\u5c31\u80fd\u5728LrcPage\u4e2d\u627e\u5230\u5bf9\u5e94\u884c\u7684\u6b4c\u8bcd\u3002<\/p>\n<p>\/\/ lrcpage.h \u4e2d\u65b0\u589e<br \/>\n\/\/ lrcpage.cpp \u4e2d\u65b0\u589e<br \/>\nint LrcPage::getLineLrcWordIndex(qint64 pos)<br \/>\n{<br \/>\n    \/\/ \u5982\u679c\u6b4c\u8bcd\u662f\u7a7a\u7684&#xff0c;\u8fd4\u56de-1<br \/>\n    if (lrcLines.isEmpty())<br \/>\n    {<br \/>\n        return -1;<br \/>\n    }<br \/>\n    if (lrcLines[0].time &gt; pos)<br \/>\n    {<br \/>\n        return 0;<br \/>\n    }<br \/>\n    \/\/ \u901a\u8fc7\u65f6\u95f4\u2f50\u8f83&#xff0c;\u83b7\u53d6\u4e0b\u6807<br \/>\n    for (int i &#061; 1; i &lt; lrcLines.size(); &#043;&#043;i)<br \/>\n    {<br \/>\n        if (pos &gt; lrcLines[i &#8211; 1].time &amp;&amp; pos &lt;&#061; lrcLines[i].time)<br \/>\n        {<br \/>\n            return i &#8211; 1;<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230&#xff0c;\u8fd4\u56de\u6700\u540e\u2f00\u2f8f<br \/>\n    return lrcLines.size() &#8211; 1;<br \/>\n}<\/p>\n<p>QString LrcPage::getLineLrcWord(qint64 index)<br \/>\n{<br \/>\n    if (index &lt; 0 || index &gt;&#061; lrcLines.size())<br \/>\n    {<br \/>\n        return &#034;&#034;;<br \/>\n    }<br \/>\n    return lrcLines[index].text;<br \/>\n}<br \/>\nvoid LrcPage::showLrcWord(int time)<br \/>\n{<br \/>\n    \/\/ \u5148\u8981\u83b7\u53d6\u6b4c\u8bcd&#8211;\u6839\u636e\u6b4c\u8bcd\u7684\u65f6\u95f4\u8fdb\u2f8f\u83b7\u53d6<br \/>\n    int index &#061; getLineLrcWordIndex(time);<br \/>\n    if (-1 &#061;&#061; index)<br \/>\n    {<br \/>\n        ui-&gt;line1-&gt;setText(&#034;&#034;);<br \/>\n        ui-&gt;line2-&gt;setText(&#034;&#034;);<br \/>\n        ui-&gt;line3-&gt;setText(&#034;&#034;);<br \/>\n        ui-&gt;lineCenter-&gt;setText(&#034;\u5f53\u524d\u6b4c\u66f2\u2f46\u6b4c\u8bcd&#034;);<br \/>\n        ui-&gt;line4-&gt;setText(&#034;&#034;);<br \/>\n        ui-&gt;line5-&gt;setText(&#034;&#034;);<br \/>\n        ui-&gt;line6-&gt;setText(&#034;&#034;);<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        ui-&gt;line1-&gt;setText(getLineLrcWord(index &#8211; 3));<br \/>\n        ui-&gt;line2-&gt;setText(getLineLrcWord(index &#8211; 2));<br \/>\n        ui-&gt;line3-&gt;setText(getLineLrcWord(index &#8211; 1));<br \/>\n        ui-&gt;lineCenter-&gt;setText(getLineLrcWord(index));<br \/>\n        ui-&gt;line4-&gt;setText(getLineLrcWord(index &#043; 1));<br \/>\n        ui-&gt;line5-&gt;setText(getLineLrcWord(index &#043; 2));<br \/>\n        ui-&gt;line6-&gt;setText(getLineLrcWord(index &#043; 3));<br \/>\n    }<br \/>\n} <\/p>\n<h4>d\u3001Irc\u6b4c\u8bcd\u540c\u6b65\u64ad\u653e\u8fdb\u5ea6<\/h4>\n<p>\u5f53\u6b4c\u66f2\u53d1\u751f\u5207\u6362\u65f6&#xff0c;\u9700\u8981\u5b8c\u6210Irc\u6b4c\u8bcd\u6587\u4ef6\u7684\u89e3\u6790&#xff1b; \u5f53\u6b4c\u66f2\u64ad\u653e\u8fdb\u5ea6\u53d1\u751f\u6539\u53d8\u65f6&#xff0c;\u6839\u636e\u6b4c\u66f2\u7684\u5f53\u524d\u64ad\u653e\u65f6\u95f4&#xff0c;\u901a\u8fc7IrcPage\u627e\u5230\u5bf9\u5e94\u884c\u6b4c\u8bcd\u5e76\u663e\u793a\u51fa\u6765\u3002<\/p>\n<p>\/\/ qqmusic.cpp \u6dfb\u52a0<br \/>\nvoid QQMusic::onMetaDataAvailableChanged(bool available)<br \/>\n{<br \/>\n    \/\/ \u6b4c\u66f2\u540d\u79f0\u3001\u6b4c\u66f2\u4f5c\u8005\u76f4\u63a5\u5230Musci\u5bf9\u8c61\u4e2d\u83b7\u53d6<\/p>\n<p>        \/\/ \u6b64\u65f6\u9700\u8981\u77e5\u9053\u5a92\u4f53\u6e90\u5728\u64ad\u653e\u5217\u8868\u4e2d\u7684\u7d22\u5f15<br \/>\n        QString musicId &#061; currentPage-&gt;getMusicIdByIndex(currentIndex);<br \/>\n    auto it &#061; musicList.findMusicByMusicId(musicId);<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u52a0\u8f7dlrc\u6b4c\u8bcd\u5e76\u89e3\u6790<br \/>\n    if (it !&#061; musicList.end())<br \/>\n    {<br \/>\n        lrcPage-&gt;parseLrc(it-&gt;getLrcFilePath());<br \/>\n    }<br \/>\n}<br \/>\nvoid QQMusic::onPositionChanged(qint64 position)<br \/>\n{<br \/>\n    \/\/ 1. \u66f4\u65b0\u5f53\u524d\u64ad\u653e\u65f6\u95f4<br \/>\n    ui-&gt;currentTime-&gt;setText(QString(&#034;%1:%2&#034;).arg(position \/ 1000 \/ 60, 2, 10,<br \/>\n        QChar(&#039;0&#039;))<br \/>\n        .arg(position \/ 1000 % 60, 2, 10,<br \/>\n            QChar(&#039;0&#039;)));<br \/>\n    \/\/ 2. \u66f4\u65b0\u8fdb\u5ea6\u6761\u7684\u4f4d\u7f6e<br \/>\n    ui-&gt;progressBar-&gt;setStep(position \/ (float)totalTime);<br \/>\n    \/\/ 3. \u540c\u6b65lrc\u6b4c\u8bcd<br \/>\n    if (playList-&gt;currentIndex() &gt;&#061; 0)<br \/>\n    {<br \/>\n        lrcPage-&gt;showLrcWord(position);<br \/>\n    }<br \/>\n} <\/p>\n<h2>\u6b4c\u66f2\u6570\u636e\u652f\u6301\u6301\u4e45\u5316<\/h2>\n<p>\u652f\u6301\u64ad\u653e\u76f8\u5173\u529f\u80fd\u4e4b\u540e&#xff0c;\u6bcf\u6b21\u5728\u9a8c\u8bc1\u529f\u80fd\u65f6\u90fd\u9700\u8981\u4ece\u78c1\u76d8\u4e2d\u52a0\u8f7d\u6b4c\u66f2\u6587\u4ef6&#xff0c;\u975e\u5e38\u9ebb\u70e6\u3002\u800c\u4e14\u4e4b\u524d\u6536\u85cf\u7684\u559c\u6b22\u6b4c\u66f2\u4ee5\u53ca\u64ad\u653e\u8bb0\u5f55\u5728\u7a0b\u5e8f\u5173\u95ed\u4e4b\u540e\u5c31\u6ca1\u6709\u4e86&#xff0c;\u8fd9\u4e00\u822c\u662f\u65e0\u6cd5\u63a5\u53d7\u7684\u3002\u56e0\u6b64\u9700\u8981\u5c06\u6bcf\u6b21\u5728\u64ad\u653e\u5668\u4e0a\u8fdb\u884c\u7684\u64cd\u4f5c\u4fdd\u7559\u4e0b\u6765&#xff0c;\u6bd4\u5982&#xff1a;\u6240\u52a0\u8f7d\u7684\u6b4c\u66f2\u3001\u4ee5\u53ca\u6b4c\u66f2\u4fe1\u606f&#xff1b;\u6536\u85cf\u6b4c\u66f2\u4fe1\u606f&#xff1b;\u5386\u53f2\u64ad\u653e\u7b49\u4fe1\u606f\u4fdd\u5b58\u8d77\u6765&#xff0c;\u5f53\u4e0b\u6b21\u7a0b\u5e8f\u542f\u52a8\u65f6&#xff0c;\u5c06\u4fdd\u5b58\u7684\u4fe1\u606f\u52a0\u8f7d\u5230\u64ad\u653e\u5668\u5373\u53ef&#xff0c;\u8fd9\u6837\u5c31\u80fd\u5c06\u5728\u64ad\u653e\u5668\u4e0a\u7684\u64cd\u4f5c\u8bb0\u5f55\u4fdd\u7559\u4e0b\u6765\u4e86\u3002\u8981\u6c38\u4e45\u6027\u4fdd\u5b58&#xff0c;\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u5c31\u662f\u76f4\u63a5\u4fdd\u5b58\u5230\u6587\u4ef6&#xff0c;\u4f46\u662f\u4fdd\u5b58\u6587\u4ef6\u4e0d\u5b89\u5168&#xff0c;\u800c\u4e14\u9700\u8981\u81ea\u5df1\u64cd\u4f5c\u6587\u4ef6\u6bd4\u8f83\u9ebb\u70e6&#xff0c;\u672c\u6587\u91c7\u7528\u6570\u636e\u5e93\u5b8c\u6210\u4fe1\u606f\u7684\u6301\u4e45\u4fdd\u5b58\u3002<\/p>\n<h3>1\u3001SQLite\u6570\u636e\u5e93\u00a0<\/h3>\n<p>SQLite\u4e3b\u8981\u7279\u5f81: \u3002\u7ba1\u7406\u7b80\u5355&#xff0c;\u751a\u81f3\u53ef\u4ee5\u8ba4\u4e3a\u65e0\u9700\u7ba1\u7406\u3002 \u3002\u64cd\u4f5c\u65b9\u4fbf&#xff0c;SQLite\u751f\u6210\u7684\u6570\u636e\u5e93\u6587\u4ef6\u53ef\u4ee5\u5728\u5404\u4e2a\u5e73\u53f0\u65e0\u7f1d\u79fb\u690d\u3002 \u3002\u53ef\u4ee5\u975e\u5e38\u65b9\u4fbf\u7684\u4ee5\u591a\u79cd\u5f62\u5f0f\u5d4c\u5165\u5230\u5176\u4ed6\u5e94\u7528\u7a0b\u5e8f\u4e2d&#xff0c;\u5982\u9759\u6001\u5e93\u3001\u52a8\u6001\u5e93\u7b49\u3002 \u3002\u6613\u4e8e\u7ef4\u62a4\u3002<\/p>\n<h3>2\u3001QQMuic\u4e2d\u6570\u636e\u5e93\u652f\u6301\u00a0<\/h3>\n<h4>a\u3001\u6570\u636e\u5e93\u521d\u59cb\u5316<\/h4>\n<p>\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\n#include &lt;QSqlDatabase&gt;<br \/>\nQSqlDatabase sqlite;<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::initSQLite()<br \/>\n{<br \/>\n    \/\/ 1. \u521b\u5efa\u6570\u636e\u5e93\u8fde\u63a5<br \/>\n    sqlite &#061; QSqlDatabase::addDatabase(&#034;QSQLITE&#034;);<br \/>\n    \/\/ 2. \u8bbe\u7f6e\u6570\u636e\u5e93\u540d\u79f0<br \/>\n    sqlite.setDatabaseName(&#034;QQMusic.db&#034;);<br \/>\n    \/\/ 3. \u6253\u5f00\u6570\u636e\u5e93<br \/>\n    if (!sqlite.open())<br \/>\n    {<\/p>\n<p>            QMessageBox::critical(this, &#034;\u6253\u5f00QQMusicDB\u5931\u8d25&#034;,<br \/>\n                sqlite.lastError().text());<br \/>\n        return;<br \/>\n    }<br \/>\n    qDebug() &lt;&lt; &#034;SQLite\u8fde\u63a5\u6210\u529f&#xff0c;\u5e76\u521b\u5efa [QQMusic.db] \u6570\u636e\u5e93!!!&#034;;<br \/>\n    \/\/ 4. \u521b\u5efa\u6570\u636e\u5e93\u8868<br \/>\n    QString sql &#061; (&#034;CREATE TABLE IF NOT EXISTS musicInfo(\\\\<br \/>\n                         id INTEGER PRIMARY KEY AUTOINCREMENT,\\\\<br \/>\n                         musicId varchar(200) UNIQUE,\\\\<br \/>\n                         musicName varchar(50),\\\\<br \/>\n                         musicSinger varchar(50),\\\\<br \/>\n                         albumName varchar(50),\\\\<br \/>\n                         duration BIGINT,\\\\<br \/>\n                         musicUrl varchar(256),\\\\<br \/>\n                         isLike INTEGER,\\\\<br \/>\n                         isHistory INTEGER)&#034;<br \/>\n                                );<br \/>\n    QSqlQuery query;<br \/>\n    if (!query.exec(sql))<br \/>\n    {<br \/>\n        QMessageBox::critical(this, &#034;\u521b\u5efa\u6570\u636e\u5e93\u8868\u5931\u8d25&#034;,<br \/>\n            query.lastError().text());<br \/>\n        return;<br \/>\n    }<br \/>\n    qDebug() &lt;&lt; &#034;\u521b\u5efa [musicInfo] \u8868\u6210\u529f!!!&#034;;<br \/>\n}<br \/>\nQQMusic::QQMusic(QWidget* parent)<br \/>\n    : QWidget(parent)<br \/>\n    , ui(new Ui::QQMusic)<br \/>\n    , currentIndex(-1)<br \/>\n{<br \/>\n    ui-&gt;setupUi(this);<br \/>\n    initUi();<br \/>\n    \/\/ \u521d\u59cb\u5316\u6570\u636e\u5e93<br \/>\n    initSQLite();<br \/>\n    initPlayer();<br \/>\n    connectSignalAndSlots();<br \/>\n} <\/p>\n<h4>b\u3001\u6b4c\u66f2\u4fe1\u606f\u5199\u5165\u6570\u636e\u5e93<\/h4>\n<p>\u5f53\u7a0b\u5e8f\u9000\u51fa\u7684\u65f6\u5019&#xff0c;\u901a\u8fc7musicList\u83b7\u53d6\u5230\u6240\u6709music\u5bf9\u8c61&#xff0c;\u7136\u540e\u5c06music\u5bf9\u8c61\u5199\u5165\u6570\u636e\u5e93\u3002<\/p>\n<p>\/\/ musiclist.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u6240\u6709\u6b4c\u66f2\u4fe1\u606f\u66f4\u65b0\u5230\u6570\u636e\u5e93<br \/>\nvoid writeToDB();<br \/>\n\/\/ musiclist.cpp \u4e2d\u65b0\u589e<br \/>\nvoid MusicList::writeToDB()<br \/>\n{<br \/>\n    for (auto music : musicList)<br \/>\n    {<br \/>\n        \/\/ \u8ba9music\u5bf9\u8c61\u5c06\u2f83\u2f30\u5199\u2f0a\u6570\u636e\u5e93<br \/>\n        music.insertMusicToDB();<br \/>\n    }<br \/>\n}<br \/>\n\/\/ music.h \u4e2d\u65b0\u589e<br \/>\n\/\/ \u5c06\u5f53\u524dMusic\u5bf9\u8c61\u66f4\u65b0\u5230\u6570\u636e\u5e93<br \/>\nvoid insertMusicToDB();<br \/>\n\/\/ music.cpp \u4e2d\u65b0\u589e<br \/>\n#include &lt;QSqlQuery&gt;<br \/>\n#include &lt;QSqlError&gt;<br \/>\nvoid Music::insertMusicToDB()<br \/>\n{<br \/>\n    \/\/ 1. \u68c0\u6d4bmusic\u662f\u5426\u5728\u6570\u636e\u5e93\u4e2d\u5b58\u5728<br \/>\n    QSqlQuery query;<br \/>\n    \/\/ \u5f53SELECT 1&#8230;\u67e5\u8be2\u5230\u7ed3\u679c\u540e&#xff0c;\u6211\u4eec\u9700\u8981\u77e5\u9053\u662f\u5426\u5b58\u5728<br \/>\n    \/\/ SELECT EXISTS(\u2f26\u67e5\u8be2) &#xff1a; \u2f26\u67e5\u8be2\u4e2d\u5982\u679c\u6709\u8bb0\u5f55&#xff0c;SELECT EXISTS\u8fd4\u56deTRUE<br \/>\n    \/\/ \u5982\u679c\u2f26\u67e5\u8be2\u4e2d\u6ca1\u6709\u6ee1\u2f9c\u6761\u4ef6\u7684\u8bb0\u5f55&#xff0c; SELECT EXISTS\u8fd4\u56deFALSE<br \/>\n    query.prepare(&#034;SELECT EXISTS (SELECT 1 FROM MusicInfo WHERE musicId &#061; ?)&#034;);<br \/>\n    query.addBindValue(musicId);<br \/>\n    if (!query.exec())<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u67e5\u8be2\u5931\u8d25: &#034; &lt;&lt; query.lastError().text();<br \/>\n        return;<br \/>\n    }<br \/>\n    if (query.next())<br \/>\n    {<br \/>\n        bool isExists &#061; query.value(0).toBool();<br \/>\n        if (isExists)<br \/>\n        {<br \/>\n            \/\/ musicId\u7684\u6b4c\u66f2\u5df2\u7ecf\u5b58\u5728<\/p>\n<p>                \/\/ 2. \u5b58\u5728&#xff1a;\u4e0d\u9700\u8981\u518d\u63d2\u2f0amusci\u5bf9\u8c61&#xff0c;\u6b64\u65f6\u53ea\u9700\u8981\u5c06isLike\u548cisHistory\u5c5e\u6027\u8fdb\u2f8f\u66f4\u65b0<br \/>\n                query.prepare(&#034;UPDATE MusicInfo SET isLike &#061; ?, isHistory &#061; ?<br \/>\n                    WHERE musicId &#061; ? &#034;);<br \/>\n                    query.addBindValue(isLike ? 1 : 0);<br \/>\n            query.addBindValue(isHistory ? 1 : 0);<br \/>\n            query.addBindValue(musicId);<br \/>\n            if (!query.exec())<br \/>\n            {<br \/>\n                qDebug() &lt;&lt; &#034;\u66f4\u65b0\u5931\u8d25: &#034; &lt;&lt; query.lastError().text();<br \/>\n            }<br \/>\n            qDebug() &lt;&lt; &#034;\u66f4\u65b0music\u4fe1\u606f: &#034; &lt;&lt; musicName &lt;&lt; &#034; &#034; &lt;&lt; musicId;<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            \/\/ 3. \u4e0d\u5b58\u5728&#xff1a;\u76f4\u63a5\u5c06music\u7684\u5c5e\u6027\u4fe1\u606f\u63d2\u2f0a\u6570\u636e\u5e93<br \/>\n            query.prepare(&#034;INSERT INTO MusicInfo(musicId, musicName,<br \/>\n                musicSinger, albumName, musicUrl, \\\\<br \/>\n                duration, isLike, isHistory)\\\\<br \/>\n                VALUES(? , ? , ? , ? , ? , ? , ? , ? )&#034;);<br \/>\n                query.addBindValue(musicId);<br \/>\n            query.addBindValue(musicName);<br \/>\n            query.addBindValue(musicSinger);<br \/>\n            query.addBindValue(musicAlbumn);<br \/>\n            query.addBindValue(musicUrl.toLocalFile());<br \/>\n            query.addBindValue(duration);<br \/>\n            query.addBindValue(isLike ? 1 : 0);<br \/>\n            query.addBindValue(isHistory ? 1 : 0);<br \/>\n            if (!query.exec())<br \/>\n            {<br \/>\n                qDebug() &lt;&lt; &#034;\u63d2\u2f0a\u5931\u8d25: &#034; &lt;&lt; query.lastError().text();<br \/>\n                return;<br \/>\n            }<br \/>\n            qDebug() &lt;&lt; &#034;\u63d2\u2f0amusic\u4fe1\u606f: &#034; &lt;&lt; musicName &lt;&lt; &#034; &#034; &lt;&lt; musicId;<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::on_quit_clicked()<br \/>\n{<br \/>\n    \/\/ \u66f4\u65b0\u6570\u636e\u5e93<br \/>\n    musicList.writeToDB();<\/p>\n<p>        \/\/ \u5173\u95ed\u6570\u636e\u5e93\u8fde\u63a5<br \/>\n        sqlite.close();<br \/>\n    \/\/ \u5173\u95ed\u7a97\u2f1d<br \/>\n    close();<br \/>\n} <\/p>\n<h4>\u00a0c\u3001\u7a0b\u5e8f\u542f\u52a8\u65f6\u8bfb\u53d6\u6570\u636e\u5e93\u6062\u590d\u6b4c\u66f2\u6570\u636e<\/h4>\n<p>\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6&#xff0c;\u4ece\u6570\u636e\u5e93\u4e2d\u8bfb\u53d6\u5230\u6b4c\u66f2\u7684\u4fe1\u606f&#xff0c;\u5c06\u6b4c\u66f2\u4fe1\u606f\u8bbe\u7f6e\u5230musicList\u4e2d&#xff0c;\u7136\u540e\u8ba9likePage\u3001 localPage\u3001recentPage\u5c06musicList\u4e2d\u4e2a\u6b4c\u66f2\u66f4\u65b0\u5230\u5404\u81ea\u9875\u9762\u4e2d\u3002\u4ece\u6570\u636e\u5e93\u8bfb\u53d6\u6b4c\u66f2\u6570\u636e\u7684\u64cd\u4f5c&#xff0c;\u5e94\u8be5\u8ba9MusicList\u7c7b\u5b8c\u6210&#xff0c;\u56e0\u4e3a\u8be5\u7c7b\u7ba1\u7406\u6240\u6709\u7684Music\u5bf9\u8c61\u3002<\/p>\n<p>\/\/ musiclist.h \u4e2d\u65b0\u589e<br \/>\nvoid readFromDB();<br \/>\n\/\/ musiclist.cpp \u4e2d\u65b0\u589e<br \/>\n#include &lt;QSqlQuery&gt;<br \/>\n#include &lt;QSqlError&gt;<br \/>\nvoid MusicList::readFromDB()<br \/>\n{<br \/>\n    QString sql(&#034;SELECT musicId, musicName, musicSinger, albumName,\\\\<br \/>\n duration, musicUrl, isLike, isHistory \\\\<br \/>\n FROM musicInfo&#034;);<br \/>\n    QSqlQuery query;<br \/>\n    if (!query.exec(sql))<br \/>\n    {<br \/>\n        qDebug() &lt;&lt; &#034;\u6570\u636e\u5e93\u67e5\u8be2\u5931\u8d25&#034;;<br \/>\n        return;<br \/>\n    }<br \/>\n    while (query.next())<br \/>\n    {<br \/>\n        Music music;<br \/>\n        music.setMusicId(query.value(0).toString());<br \/>\n        music.setMusicName(query.value(1).toString());<br \/>\n        music.setMusicSinger(query.value(2).toString());<br \/>\n        music.setMusicAlbum(query.value(3).toString());<br \/>\n        music.setMusicDuration(query.value(4).toLongLong());<br \/>\n        music.setMusicUrl(query.value(5).toString());<br \/>\n        music.setIsLike(query.value(6).toBool());<br \/>\n        music.setIsHistory(query.value(7).toBool());<br \/>\n        musicList.push_back(music);<br \/>\n    }<br \/>\n}<br \/>\n\/\/ qqmusic.h \u4e2d\u65b0\u589e<br \/>\nvoid initMusicList();<br \/>\n\/\/ qqmusic.cpp \u4e2d\u65b0\u589e<br \/>\nvoid QQMusic::initMusicList()<br \/>\n{<br \/>\n    \/\/ 1. \u4ece\u6570\u636e\u5e93\u8bfb\u53d6\u6b4c\u66f2\u4fe1\u606f<br \/>\n    musicList.readFromDB();<br \/>\n    \/\/ 2. \u66f4\u65b0CommonPage\u2eda\u2faf<br \/>\n    \/\/ \u8bbe\u7f6eCommonPage\u7684\u4fe1\u606f<br \/>\n    ui-&gt;likePage-&gt;setMusicListType(PageType::LIKE_PAGE);<br \/>\n    ui-&gt;likePage-&gt;reFresh(musicList);<\/p>\n<p>    ui-&gt;localPage-&gt;setMusicListType(PageType::LOCAL_PAGE);<br \/>\n    ui-&gt;localPage-&gt;reFresh(musicList);<\/p>\n<p>    ui-&gt;recentPage-&gt;setMusicListType(PageType::HISTORY_PAGE);<br \/>\n    ui-&gt;recentPage-&gt;reFresh(musicList);<br \/>\n}<br \/>\nQQMusic::QQMusic(QWidget* parent)<br \/>\n    : QWidget(parent)<br \/>\n    , ui(new Ui::QQMusic)<br \/>\n    , currentIndex(-1)<br \/>\n{<br \/>\n    \/\/ &#8230;<br \/>\n    \/\/ \u521d\u59cb\u5316\u6570\u636e\u5e93<br \/>\n    initSQLite();<br \/>\n    \/\/ \u52a0\u8f7d\u6570\u636e\u5e93\u6b4c\u66f2\u2f42\u4ef6<br \/>\n    initMusicList();<br \/>\n    \/\/ &#8230;<br \/>\n} <\/p>\n<p>QQMusic\u4e2d\u7684initUi\u4e2d\u5c06\u5176\u53bb\u6389<\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"192\" src=\"2025-04-291t2x4ug5i1g.png\" width=\"398\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e12\u6b21\uff0c\u6536\u85cf26\u6b21\u3002\u5206\u6790\uff1a\u2460&quot;\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2461&quot;\u4eca\u65e5\u4e3a\u4f60\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2462\u5177\u4f53\u63a8\u8350\u7684\u6b4c\u66f2\u5185\u5bb9\uff0c\u70b9\u51fb\u5de6\u53f3\u4e24\u4fa7\u7ffb\u9875\u6309\u94ae\uff0c\u5177\u6709\u8f6e\u756a\u56fe\u6548\u679c\uff0c\u5c06\u5149\u6807\u653e\u5230\u56fe\u4e0a\uff0c\u6709\u56fe\u7247\u4e0a\u79fb\u52a8\u753b\u2463&quot;\u4f60\u7684\u6b4c\u66f2\u8865\u7ed9\u7ad9&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u5177\u4f53\u663e\u793a\u97f3\u4e50\uff0c\u548c\u2462\u5b9e\u9645\u662f\u4e00\u6837\u7684\uff0c\u4e0d\u540c\u7684\u662f\u2462\u4e2d\u97f3\u4e50\u53ea\u6709\u4e00\u884c\uff0c\u2464\u4e2d\u7684\u97f3\u4e50\u6709\u4e24\u884c\u56e0\u4e3a\u9875\u9762\u4e2d\u5143\u7d20\u8f83\u591a\uff0c\u76f4\u63a5\u6446\u5230\u4e00\u4e2a\u9875\u9762\u592a\u62e5\u6324\uff0c\u4ece\u53f3\u4fa7\u7684\u6eda\u52a8\u6761\u53ef\u4ee5\u770b\u51fa\uff0c\u6574\u4e2a\u9875\u9762\u4e2d\u7684\u5143\u7d20\u90fd\u653e\u7f6e\u5728QScrollArea\u4e2d\u3002<\/p>\n","protected":false},"author":2,"featured_media":34368,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[55,218,190],"topic":[],"class_list":["post-34388","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-c","tag-qt","tag-190"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/34388.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e12\u6b21\uff0c\u6536\u85cf26\u6b21\u3002\u5206\u6790\uff1a\u2460&quot;\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2461&quot;\u4eca\u65e5\u4e3a\u4f60\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2462\u5177\u4f53\u63a8\u8350\u7684\u6b4c\u66f2\u5185\u5bb9\uff0c\u70b9\u51fb\u5de6\u53f3\u4e24\u4fa7\u7ffb\u9875\u6309\u94ae\uff0c\u5177\u6709\u8f6e\u756a\u56fe\u6548\u679c\uff0c\u5c06\u5149\u6807\u653e\u5230\u56fe\u4e0a\uff0c\u6709\u56fe\u7247\u4e0a\u79fb\u52a8\u753b\u2463&quot;\u4f60\u7684\u6b4c\u66f2\u8865\u7ed9\u7ad9&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u5177\u4f53\u663e\u793a\u97f3\u4e50\uff0c\u548c\u2462\u5b9e\u9645\u662f\u4e00\u6837\u7684\uff0c\u4e0d\u540c\u7684\u662f\u2462\u4e2d\u97f3\u4e50\u53ea\u6709\u4e00\u884c\uff0c\u2464\u4e2d\u7684\u97f3\u4e50\u6709\u4e24\u884c\u56e0\u4e3a\u9875\u9762\u4e2d\u5143\u7d20\u8f83\u591a\uff0c\u76f4\u63a5\u6446\u5230\u4e00\u4e2a\u9875\u9762\u592a\u62e5\u6324\uff0c\u4ece\u53f3\u4fa7\u7684\u6eda\u52a8\u6761\u53ef\u4ee5\u770b\u51fa\uff0c\u6574\u4e2a\u9875\u9762\u4e2d\u7684\u5143\u7d20\u90fd\u653e\u7f6e\u5728QScrollArea\u4e2d\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/34388.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-29T02:38:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023822-68103b9ec6784.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/34388.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/34388.html\",\"name\":\"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-04-29T02:38:29+00:00\",\"dateModified\":\"2025-04-29T02:38:29+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/34388.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/34388.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/34388.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/34388.html","og_locale":"zh_CN","og_type":"article","og_title":"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e12\u6b21\uff0c\u6536\u85cf26\u6b21\u3002\u5206\u6790\uff1a\u2460&quot;\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2461&quot;\u4eca\u65e5\u4e3a\u4f60\u63a8\u8350&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u2462\u5177\u4f53\u63a8\u8350\u7684\u6b4c\u66f2\u5185\u5bb9\uff0c\u70b9\u51fb\u5de6\u53f3\u4e24\u4fa7\u7ffb\u9875\u6309\u94ae\uff0c\u5177\u6709\u8f6e\u756a\u56fe\u6548\u679c\uff0c\u5c06\u5149\u6807\u653e\u5230\u56fe\u4e0a\uff0c\u6709\u56fe\u7247\u4e0a\u79fb\u52a8\u753b\u2463&quot;\u4f60\u7684\u6b4c\u66f2\u8865\u7ed9\u7ad9&quot;\u6587\u672c\u63d0\u793a\uff0c\u5373QLabel\u5177\u4f53\u663e\u793a\u97f3\u4e50\uff0c\u548c\u2462\u5b9e\u9645\u662f\u4e00\u6837\u7684\uff0c\u4e0d\u540c\u7684\u662f\u2462\u4e2d\u97f3\u4e50\u53ea\u6709\u4e00\u884c\uff0c\u2464\u4e2d\u7684\u97f3\u4e50\u6709\u4e24\u884c\u56e0\u4e3a\u9875\u9762\u4e2d\u5143\u7d20\u8f83\u591a\uff0c\u76f4\u63a5\u6446\u5230\u4e00\u4e2a\u9875\u9762\u592a\u62e5\u6324\uff0c\u4ece\u53f3\u4fa7\u7684\u6eda\u52a8\u6761\u53ef\u4ee5\u770b\u51fa\uff0c\u6574\u4e2a\u9875\u9762\u4e2d\u7684\u5143\u7d20\u90fd\u653e\u7f6e\u5728QScrollArea\u4e2d\u3002","og_url":"https:\/\/www.wsisp.com\/helps\/34388.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-04-29T02:38:29+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250429023822-68103b9ec6784.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"37 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/34388.html","url":"https:\/\/www.wsisp.com\/helps\/34388.html","name":"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-04-29T02:38:29+00:00","dateModified":"2025-04-29T02:38:29+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/34388.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/34388.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/34388.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u57fa\u4e8eQT\u7684\u4effQQ\u97f3\u4e50\u64ad\u653e\u5668"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/34388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=34388"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/34388\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/34368"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=34388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=34388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=34388"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=34388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}