最新资讯

  • 【实战项目】简易版的 QQ 音乐:一

【实战项目】简易版的 QQ 音乐:一

2025-05-13 13:01:32 0 阅读

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:能自我实现简易版的 QQ 音乐。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:实战项目_დ旧言~的博客-CSDN博客

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

一、项目演示

演示效果

该项目是基于 QT 开发的音乐播放软件,界面友好,功能丰富,旨在加强同学们对 QT 知识的综合应用,以及熟悉 QT 项目开发的流程。主要功能如下:

窗口 head 部分:

  • 点击最小化按钮,窗口最小化
  • 点击最大化按钮,窗口示反应(即禁止窗口最大化)
  • 点击关闭按钮,程序退出
  • 点击皮肤按钮,更换皮肤(该功能暂未支持,uu 可私下扩展,最简单的方式就是更换窗体的背景颜色)
  • 搜索框搜索功能(该功能暂未支持,uu 可私下扩展)

窗口 body 左侧:

  • 点击推荐按钮,窗口右侧显示:推荐Page(暂只有页面)
  • 点击电台按钮,窗口右侧显示:电台Page(未支持)
  • 点击⾳乐馆按钮,窗口右侧显示:音乐馆Page(未支持)
  • 点击我喜欢按钮,窗口右侧显示:收藏的音乐Page
  • 点击本地下载按钮,窗口右侧显示:本地音乐Page
  • 点击最近播放按钮,窗口右侧显示:最近播放Page

注意:左侧按钮,当光标悬停时会有不同颜⾊突出显⽰,当点击时会有绿⾊显⽰,并且按钮的
右侧有跳动的竖条。

窗⼝右侧:

  • 点击全部播放按钮,播放当前页面列表中所有音乐
  • 双击列表中某音乐,播放当前选中音乐
  • 点击心支持收藏
  • ⽀持最近播放过音乐记忆

播放控制区:

  • 支持seek功能,即拖拽到歌曲指定位置播放
  • 支持:随机、单曲循环、循环播放
  • 支持播放上⼀曲
  • 支持播放上一曲
  • 支持播放下⼀曲
  • 支持播放和暂停
  • 支持音量调节和静⾳
  • 支持歌曲总时长显示 + 当前播放时间显示
  • 支持持 LRC 歌词同步显示

二、界面开发


2.1、界面简要分析

界⾯上控件比较多,归类之后主要分为两部分:head 区和 body 区。

head 区域从左往右依次为:图标、搜索框、更换皮肤按钮、最小化 & 最大化 & 退出按钮。

body 区域分为左侧种类选择区域和右侧 Page 展示区:

Body左侧区域有两部分组成:在线音乐 和 我的音乐,两部分内部的控件种类是相同的。

  • ① 说明区域,实际为 QLabel
  • ② 自定义控件(按钮的扩展):图片+文本+动画
  • ③ 同②,⾃定义控件(按钮的扩展):图片+文本+动画
  • ④ 同②,⾃定义控件(按钮的扩展):图片+文本+动画

Body 右侧区域由:Page 区、播放进度、播放控制区三部分构成。

  • ① Page区:歌曲信息页面,点击 < 或 > 具有轮播图效果
  • ② 播放进度:当前歌曲播放进度说明,支持seek功能,与播放控制区时间、以及LRC歌词是同步的
  • ③ 播放控制区域:显示歌曲图片 & 名称 & 歌手、播放模式 & 下⼀曲 & 播放暂停 & 上⼀曲 & ⾳量调节和静⾳ & 添加本地⾳乐、当前播放时间 / 歌曲总时长 & 弹出歌词窗口按钮

整个页面内容可以分为上下两组:今日为你推荐、你的歌曲补给站。两组的布局实际是相同的,元素:

  1. 上方显示 1 行,内部有4个推荐元素;下方显示 2 行,每行有 4 个推荐元素
  2. 左右两侧⼀个按钮,点击后推荐内容会更换下一批,不停点击会循环推荐
  3. 当鼠标悬停在推荐元素上时,推荐元素会向上移动,当鼠标离开时,又回到原位置
  4. 当鼠标悬停在推荐元素上时,同时会出现小手图标,说明该推荐元素具有点击功能

我喜欢、本地下载、最近播放类似下图:

这三个Page中布局、控件都是相同的,只是填充的数据不⼀样。每个Page中包含了多个控件,大致如下:

  • ① QLabel:类型说明
  • ② QLabel:图⽚显⽰
  • ③ QButton:播放全部按钮
  • ④ ⼀组QLabel说明:⾳乐、歌⼿、专辑
  • ⑤ QListWidget:播放列表

歌词页面:解析当前正在播放音乐的歌词,同步显示在界面上。

显示内容分为:歌曲信息、歌词部分、左上方收起隐藏按钮。

  • 歌曲信息由歌曲名称(QLabel)和歌手名称(QLabel)构成
  • 歌词部分展示当前在唱歌词(QLabel)和在唱部分前三行和后三行歌词(QLabel)展示,当前播放
  • 歌词突出显示
  • 点击收起按钮后,该页面会以动画的方式收起

说明:

  1. 当歌曲有LRC歌词时,播放时歌词会随播放时间自动调整;歌曲没有LRC歌词时,歌词部分显示空字符。
  2. 以上对本项目的界面进行了简单的说明,大家先有个初步了解,接下来利用QT Designer完成界⾯的布局。

2.2、界面开发


2.2.1、创建工程

创建一个基于 QWidget 的工程,选中生成 form 选项,将来界面部分主要使用 QDesigner 来设计:

2.2.2、主界面布局设置

基于Widget局部:

QT系统提供4种布局管理器:

  • QHBoxLayout:水平布局
  • QVBoxLayout:垂直布局
  • QGridLayout:栅格布局
  • QFormLayout:表单布局

为什么采用 widget 来设计:

由于⼀个 widget 中只能包含上述布局管理器中的⼀种,所以直接使用布局管理器来布局不是很灵活;而一个 widget 中可以包含多个 widget ,在 widget 中的控件可以进行水平、垂直、栅格、表单等布局操作,非常灵活。

窗口主框架设计:

主窗口的布局:

选中 QQMusic ,在弹出的属性中找到 geometry 属性,将窗口宽度修改为:1040,高度修改为700

从控件区拖拽⼀个 Widget 到窗口区域,objectName 修改为:background,选中 QQMusic ,然后点击垂直布局,background 就填充满了整个窗口。

为了看到效果,选中 backroound 控件,然后右键单击,弹出菜单中选择改变样式表,内部添加:

background-color:gray;

整个窗口由 head 和 body 上下两部分组成:

  • 直接拖两个 Widget 放到设计区,双击将名字修改为 head 和 body
  • 修改背景颜色方便查看效果,head 背景色修改为 green,body 背景色修改为 pink
background-color:green;
background-color:pink;

head 在上,body 在下,然后选中 background 对象,点击垂直布局:

head 和 body 平分了整个background,并且 head 和 body 的 margin 有间隔。再次选中background 对象,右侧属性部分下滑找到 Layout ,将 Margni 和 Space 修改为 0:

但是 head 占区域过大,选中 head 对象,将 head 的 minimumSize 和 maxmumSize 属性的高度都调整为 80 ,这样head的大小就固定了:

head 内部设计:

head 内部由两部分构成,headLeft 区域显⽰图标,headRight 区域为搜索框和功能按钮区域。拖两个 widget 到 head 中,将 objectName 修改为 headLeft 和 headRight ,背景颜色修改为:

然后选中 head 对象,点击水平布局(垂直布局左侧就是水平布局),就会呈现如下布局:

继续选中 head 对象,下滑找到 Layout 属性,将 Margin 和 Spacing 全部设置为 0 ,选中 headLeft 对象,将 minimumSize 和 maximumSize 的宽度修改为 200 ,就能看到 head 的初步效果:

headLeft:

拖⼀个 QLabel 控件放置 headLeft 内,将 QLabel 的 objectName 修改为 logo ,text 属性修改为空;然后选中 headLeft ,点击水平布局,此时 QLabel 就会填充满 headLeft 。同样需要选中headLeft,下滑找到 Layout 属性,将 Margin 和 spacing 全部设置为0

headRight:

headRight 内部也是由两部分构成:搜索框和按钮区域拖拽两个 widget 到 headRight ,修改objectName 为 SearchBox 和 SettingBox ,将 SearchBox 的 minimumSize 和 maximumSize 的宽度修改为 300,背景颜色分别修改为:

选中 headRight ,然后点击水平布局,并将 headRight 的 Margin 和 Spacing 修改为 0 ,就能看到下面的效果:

searchBox:

拖⼀个 QLineEdit 进去,然后选中 searchBox 点击水平布局

settingBox:

拖拽⼀个按钮到 SettingBox ,按钮的 minimumSize 和 maximumSize 的宽度和高度都修改为 30,然后鼠标选中,按着 ctrl键+鼠标 拖拽,复制 3 个出来摆放好,依次将四个按钮 objectName 从左往右修改为:skin、max、min、quit,并将按钮的 text 属性也修改为空,将来设置图片。在控件区域找到 Spacers ,找到 Horizontal Spacer 控件,拖拽到 SettingBox 区域。

选中 SettingBox ,点击水平布局,并将 SettingBox 的 Margin 和 Spacing 修改为 0

Body部分布局:

整个body部分是由bodyLeft和bodyRight两部分组成:

① 拖两个 Widget 到 Body 中,将 objectName 修改为 bodyLeft 和 bodyRight

② 将 bodyLeft 颜色修改为:

③ 选中 body,点击水平布局,将 bodyLeft 的 minimumSize 和 maxmumSize 的宽度修改为 200

④ 选中 Body,将 body 的 Margin 和 Spacing 修改为 0

bodyLeft 内部布局:

  1. 拖拽⼀个 Widget 到 bodyLeft ,将 objectName 修改为 leftBox ,背景颜⾊修改为:background-color:pink.
  2. 拖拽 Vertical Spacer 到 bodyLeft.
  3. 选中 leftBox ,将 minmumSize 和 maxmumSize 的高度修改为 400.
  4. 选中 bodyLeft ,点击垂直布局,并将 bodyLeft 的 Margin 和 Spacing 修改为 0.

leftBox 内部布局:

leftBox内部包含:在线音乐 和 我的音乐 两部分。

① 拖拽两个 Widget 到 leftBox 中,将 objectName 依次修改为:onlineMusic 和 myMusic

② 颜色分别修改为:

③ 选中 leftBox ,点击垂直布局,然后将 Margin 和 Spacing 设置为 0

④ onlineMusic 和 myMusic 内部的元素都是相同的,由⼀个 QLabel 和三个 Widget 构成,后期Widget 会替换为自定义按钮,此处先用 Widget 占位。因此分别向 onlineMusic 和 myMusic 内部拖拽⼀个 QLabel 和三个 QWidget ,并选中 onlineMusic 和 myMusic 点击垂直布局,然后将Margin 和 Spacing 设置为 0

bodyRight布局:

bodyRight 由层叠窗口、进度滑竿、播放控制区三部分组成:

① 拖拽层叠窗口控件 Stacked Widget ,就在 Widget 控件上方到 bodyRight 中

② 拖拽 Widget 到 bodyRight ,将 objectName 修改为 processBar,将 minimumSize 和maximumSize 的高度修改为 30 ,背景颜色修改为绿色。

③ 拖拽 Widget 到 bodyRight ,将 objectName 修改为 controlBox ,将 minmumSize 高度修改为 60

④ 选中 bodyRight ,点击垂直布局,然后将 bodyRight 的 Margin 和 Spacing 修改为 0

⑤ 为了能看到效果,将 processBar 颜色修改为:background-color:pink.

stackedWidget 内部增加页面:

stackedWidget 默认会提供两个页面,还需添加四个页面。

在对象区域选中 stackedWidget 控件,然后右键单击弹出菜单中选择添加页:

以类似的方式添加添加 4 个页面,并修改每个页面的 objectName 如下:

选中 stackedWidget ,然后右键单击,弹出菜单中选择:改变页顺序,在弹出的窗口中就能看到每个页面的索引:

六个页面中,recPage 页面需要实现,musicPage、radioPage 暂未支持,同学们可自行扩展likePage、localPage、recentPage 三个页面都是雷同的,将来自定义即可。

ControlBox内部布局:

该区域内部由三部分组成:歌曲信息部分、播放控制部分、时间显示

① 拖拽三个 Widget 到 ControlBox 中,将 ObjectName 依次修改为 play_1、play_2、play_3 颜色依次修改为:

② 选中 ControlBox ,点击水平布局,将 ControlBox 的 Margin 和 Spacing 修改为 0

play1 内部:

拖拽 3 个 QLabel ,放置歌曲图片、歌手名和歌曲名字,调整好位置,将 QLabel 的 objectName 修改为:musicCover、musicName、musicSinger然后选中 play1 ,点击栅格布局

play2 内部:

QWidget::setWindowFlag(...): 设置窗⼝格式,⽐如创建⽆边框的窗⼝

从左到右依次摆放 6 个按钮,按钮的 minimumSize 和 maxmumSize 均修改为 30 * 30 ,将objectName 从左往右依次修改为:playMode、playUp、Play、playDown、volume、addLocal;然后选中 play2 ,点击水平布局,并将 play_2 的 Margin 和 Spacing 修改为 0.

play3 内部:

拖四个 QLabel 和一个按钮,调整大小位置,从左往右 QLabel 的 objectName 依次修改为:labelNull、currentTime、line、totalTime,按钮的 objectName 修改为 lrcWord ,按钮的maxmumSize 的宽度和高度修改为 30*30 ;选中 play3 ,点击水平布局,并将 play2 的 Margin 和Spacing 修改为 0.

2.3、界面美化


2.3.1 、主窗口设定

设置窗口:

仔细观察发现主窗口是没有标题栏,因此在窗口创建前,就需要设置下窗口的格式:

QWidget::setWindowFlag(...): 设置窗⼝格式,⽐如创建⽆边框的窗⼝

由于窗口中控件比较多,这些控件将来都需要初始化,如果将所有代码放在 QQMusic 的构造函数中实现,将来会造成构造函数非常臃肿,因此在 QQMusic 类中添加 initUI() 方法来完成界面初始化工作:

// QQMusic.h ⽂件中添加:
void initUI();
// 添加完成后,光标放在函数名字上按 alt + Enter 组合键完成⽅法定义
// QQMusic.cpp 头⽂件中完成定义

void QQMusic::initUI()
{
    // 设置⽆边框窗⼝,即窗⼝将来⽆标题栏
    setWindowFlag(Qt::WindowType::FramelessWindowHint);
}

运行后,发现有以下两个问题:

  1. 窗口无标题栏,找不到关闭按钮,导致窗口无法关闭
  2. 窗口无法拖拽

关闭窗口,可以先将光标放在任务栏中当前应用程序图标上,弹出的框中选择关闭,后序会实现关闭功能:

主界面无法拖动,此时只需要处理下鼠标单击 (mousePressEvent) 和 鼠标移动(mouseMoveEvent) 事件即可。鼠标左键按下时,记录下窗口左上角和鼠标的相对位置鼠标移动时,会产生新的位置,保持鼠标和窗口左上角相对位置不变,通过 move 修改窗口的左上叫坐标即可:

/
// QQMusic.h中添加
protected:
// 重写QWidget类的⿏标单击和⿏标滚轮事件
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent* event)override;
// 记录光标相对于窗⼝标题栏的相对距离
QPoint dragPosition;
/
// QQMusic.cpp中添加

void QQMusic::mousePressEvent(QMouseEvent *event)
{
    // 拦截⿏标左键单击事件
    if(event->button() == Qt::LeftButton)
    {
        // event->globalPos():⿏标按下事件发⽣时,光标相对于屏幕左上⻆位置
        // frameGeometry().topLeft(): ⿏标按下事件发⽣时,窗⼝左上⻆位置
        // geometry(): 不包括边框及顶部标题区的范围
        // frameGeometry(): 包括边框及顶部标题区的范围
        // event->globalPos() - frameGeometry().topLeft() 即为:
        // ⿏标按下时,窗⼝左上⻆和光标之间的距离差
        // 想要窗⼝⿏标按下时窗⼝移动,只需要在mouseMoveEvent中,让光标和窗⼝左上⻆保持相同的位置差
        // 获取⿏标相对于屏幕左上⻆的全局坐标
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        return;
    }
    QWidget::mousePressEvent(event);
}

void QQMusic::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
        // 根据⿏标移动更新窗⼝位置
        move(event->globalPos() - dragPosition);
        return;
    }
    QWidget::mouseMoveEvent(event);
}

给窗口添加阴影需要用到 QGraphicsDropShadowEffect 类,具体步骤如下:

  1. 创建 QGraphicsDropShadowEffect 类对象
  2. 设置阴影的属性。比如:设置阴影的偏移、颜色、圆角等
  3. 阴影设置到具体对象上

在 initUI() 函数中添加如下代码:

// 设置窗⼝背景透明
this->setAttribute(Qt::WA_TranslucentBackground);

// 给窗⼝设置阴影效果
QGraphicsDropShadowEffect* shadowEffect = new
QGraphicsDropShadowEffect(this);
shadowEffect->setOffset(0,0);

// 设置阴影偏移
shadowEffect->setColor("#000000");

// 设置阴影颜⾊:⿊⾊
shadowEffect->setBlurRadius(10);

// 设置阴影的模糊半径
this->setGraphicsEffect(shadowEffect);

2.3.2、添加图片资源

添加一个 qrc 文件,将图片资源拷贝到工程目录下,并添加到工程中:

将之前布局时所有按钮的背景全色全部清除掉,按照下面的风格重新设定。

2.3.3、head 处理

颜色查看器:

三、自定义控件


3.1、BtForm


3.1.1、BtForm 界面设计

添加⼀个新设计界面,命名为BtForm:

该控件实际由:

图片、文字、动画三部分组成。图片和文字分别用QLabel展示,动画部分内部实际为 4 个QLabel 。

① 将 BtForm 的 geometry 的宽度和高度修改为 200*35。

② 拖⼀个 Widget 到 btForm 中,objectName 修改为 btStyle,将 btForm 的 margin 和 Spacing 设置为 0.

③ 拖 2 个 QLable 和 1 个 Widget 到 btStyle 中,并将 objectName 依次修改为 btIcon、btText、lineBox

  • btIcon 的 minimumSize 和 maximumSize 的宽度设置为 30 (为了看到效果可将颜色设置为red)
  • btText 的 minimumSize 和 maximumSize 的宽度设置为 90 (为了看到效果可将颜色设置为green)
  • lineBox的 minimumSize 和 maximumSize 的宽度设置为 30
  • 然后选中 btStyle,并将其 margin 和 Spacing 设置为 0

④ 然后往 lineBox 内部拖 4 个 QLabel,objectName 依次修改为 line1、line2、line3、line4,minimumSize 和 maximumSize 的宽度均设置为 2

将 bodyLeft 内部 onlineMusic 和 MyMusic 中的 QWidget 全部提升为 BtForm。具体操作:

选中要提升的控件,比如:Rec,在弹出的菜单中选择提升为,会出现⼀个新窗口(如下右侧图),在提升的类名称中输入要提升为的类型 BtForm,然后点击添加,最后选中 btform.h 点击提升,便可以将 Rec 由 QWidget 提升为自定义的 BtForm 类型。

3.1.2、BtForm 类中实现

设置按钮上的图片和文字信息,以及该按钮关联的 page 页面:

// btform.h 新增
// 按钮id:该按钮对应的page⻚
int id = 0;
// 设置图标 ⽂字 id
void seticon(QString btIcon,QString content,int mid);

// btform.cpp新增
void btFrom::seticon(QString btIcon,QString btText,int mid)
{
    // 设置⾃定义按钮的图⽚、⽂字、以及id
    ui->btIcon->setPixmap(QPixmap(btIcon));
    ui->btText->setText(btText);
    this->id = mid;
}

在 QQMusic.cpp 的 initUI() 函数中新增:

void Widget::initUi()
{
    // ...
    // 设置BodyLeft中6个btForm的信息
    ui->rec->seticon(":/images/rec.png", "推荐", 1);
    ui->music->seticon(":/images/music.png", "⾳乐馆", 2);
    ui->audio->seticon(":/images/radio.png", "电台", 3);
    ui->like->seticon(":/images/like.png", "我喜欢", 4);
    ui->local->seticon(":/images/local.png", "本地下载", 5);
    ui->recent->seticon(":/images/recent.png", "最近播放", 6);
}

按钮响应:重写鼠标 mousePressEvent,当按钮按下时

①:按钮颜色发生变化

②:给 QQMusic 类发送 click 信号

// btform.h 新增
protected:
    // ⿏标点击事件
    virtual void mousePressEvent(QMouseEvent *event);

// btform.cpp新增
void btFrom::mousePressEvent(QMouseEvent *event)
{
    // 告诉编译器不要触发警告
    (void)event;
    // ⿏标点击之后,背景变为绿⾊,⽂字变为⽩⾊
    ui->btStyle->setStyleSheet("#btStyle{ background:rgb(30,206,154);}*{color:#F6F6F6;}");
    // 发送⿏标点击信号
    emit click(this->id);
}

③ QQMusic 类处理该信号,内部:实现窗口切换,并清除上次按钮点击留下的样式,因 QQMuisc 中需要新增:

// qqmusic.h 新增

// btForm点击槽函数
void onBtFormClick(int id);

// qqmusic.cpp 新增
void QQMusic::connectSignalAndSlot()
{
    // ...
    // ⾃定义的btFrom按钮点击信号,当btForm点击后,设置对应的堆叠窗⼝
    connect(ui->rec, &btFrom::click, this, &QQMusic::onBtFormClick);
    connect(ui->musics, &btFrom::click, this, &QQMusic::onBtFormClick);
    connect(ui->audio, &btFrom::click, this, &QQMusic::onBtFormClick);
    connect(ui->like, &btFrom::click, this, &QQMusic::onBtFormClick);
    connect(ui->local, &btFrom::click, this, &QQMusic::onBtFormClick);
    connect(ui->recent, &btFrom::click, this, &QQMusic::onBtFormClick);
}

void Widget::onBtFormClick(int id)
{
    // 1.获取当前⻚⾯所有btFrom按钮类型的对象
    QList buttonList = this->findChildren();
    // 2.遍历所有对象, 如果不是当前id的按钮,则把之前设置的背景颜⾊清除掉
    foreach (BtForm* btitem, buttonList)
    {
        if (id  != btitem->getId())
        {
            btitem->clearBg();
        }
    }
    // 3.设置当前栈空间显⽰⻚⾯
    ui->stackedWidget->setCurrentIndex(id - 1);
}

④ BtForm类中新增:
 

// btform.h 新增
public:
    // 清除上⼀次按钮点击留下的样式
    void clearBg();
    // 获取id
    int getId();

// btform.cpp 新增:
void BtForm::clearBg()
{
    // 清除上⼀个按钮点击的背景效果,恢复之前的样式
    ui->btStyle->setStyleSheet("#btStyle:hover{ background:#D8D8D8;} ");
}

int BtForm::getId()
{
    return id;
}

为了能看到 Page 切换的效果,可以在 stackedWidget 的每个 page 上放⼀个 QLabel 说明。

BtFrom上的动画效果:

Qt 中 QPropertyAnimation 类可以提供简单的动画效果,允许对 QObject 获取派生类的可读写属性进行动画处理,创建平滑、连续的动画效果,比如控件的位置、大小、颜色等属性变化,使用时需包含

lineBox 中的 line1、line2、line3、line4 添加动画效果,BtForm 类中增加如下代码:

    // btform.h 新增:
    // linebox动画起伏效果
    QPropertyAnimation *animationLine1;
    QPropertyAnimation *animationLine2;
    QPropertyAnimation *animationLine3;
    QPropertyAnimation *animationLine4;

// btform.cpp的构造函数中新增:
BtForm::BtForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BtForm)
{
    ui->setupUi(this);
    // 设置line1的动画效果
    line1Animal = new QPropertyAnimation(ui->line1, "geometry", this);
    line1Animal->setDuration(1500);
    line1Animal->setKeyValueAt(0, QRect(0, 15, 2, 0));
    line1Animal->setKeyValueAt(0.5, QRect(0, 0, 2, 15));
    line1Animal->setKeyValueAt(1, QRect(0, 15, 2, 0));
    line1Animal->setLoopCount(-1);
    line1Animal->start();

    // 设置line2的动画效果
    line2Animal = new QPropertyAnimation(ui->line2, "geometry", this);
    line2Animal->setDuration(1600);
    line2Animal->setKeyValueAt(0, QRect(7, 15, 2, 0));
    line2Animal->setKeyValueAt(0.5, QRect(7, 0, 2, 15));
    line2Animal->setKeyValueAt(1, QRect(7, 15, 2, 0));
    line2Animal->setLoopCount(-1);
    line2Animal->start();

    // 设置line3的动画效果
    line3Animal = new QPropertyAnimation(ui->line3, "geometry", this);
    line3Animal->setDuration(1700);
    line3Animal->setKeyValueAt(0, QRect(14, 15, 2, 0));
    line3Animal->setKeyValueAt(0.5, QRect(14, 0, 2, 15));
    line3Animal->setKeyValueAt(1, QRect(14, 15, 2, 0));
    line3Animal->setLoopCount(-1);
    line3Animal->start();

    // 设置line4的动画效果
    line4Animal = new QPropertyAnimation(ui->line4, "geometry", this);
    line4Animal->setDuration(1800);
    line4Animal->setKeyValueAt(0, QRect(21, 15, 2, 0));
    line4Animal->setKeyValueAt(0.5, QRect(21, 0, 2, 15));
    line4Animal->setKeyValueAt(1, QRect(21, 15, 2, 0));
    line4Animal->setLoopCount(-1);
    line4Animal->start();
}

关于动画显示:

动画并不是所有页面都显示,只有当前选中的页面显示,所以默认情况下,动画隐藏。默认情况下设置 addlocal 显示。

// btform.h 新增:
// 显⽰动画效果
void showAnimal();

// btform.cpp的中新增:
void btFrom::showAnimal()
{
    // 显⽰linebox, 设置颜⾊为绿⾊
    ui->linebox->show();
}

// QQMusic的initUI中设置默认选中
void QQMusic::initUi()
{
    // ...
    // 本地下载BtForm动画默认显⽰
    ui->local->showAnimal();
    ui->stackedWidget->setCurrentIndex(4);
}

3.2、推荐页面


3.2.1、推荐页面分析

仔细观察推荐页面,对其进行拆解发现,推荐页面由五部分构成:

① "推荐"文本提示,即 QLabel

② "今日为你推荐"文本提示,即 QLabel

③ 具体推荐的歌曲内容,点击左右两侧翻页按钮,具有轮番图效果,将光标放到图上,有图片上移动画

④ "你的歌曲补给站"文本提示,即 QLabel

⑤ 具体显示音乐,和③实际是⼀样的,不同的是③中音乐只有⼀行,⑤中的音乐有两行因为页面中元素较多,直接摆到⼀个页面太拥挤,从右侧的滚动条可以看出,整个页面中的元素都放置在 QScrollArea 中。仔细分析③发现,里面包含了:

3.2.2、推荐页布局

在 stackedWidget 中选中推荐页面,objectName 为 recPage 的页面,删掉之前添加的 QLabel 推荐提示:

① 拖拽一个 QScrollArea 到 recPage 中,geometry 的宽度和高度修改为 820 和 500,

② 拖拽一个 QLable,objectName 修改为 recText,显示内容修改为推荐,minimumSize 和maximumSize 的高度均修改为 50,Font 大小修改为 24

③ 再拖拽一个 QLable 和 Widget ,QLable 的 objectName 修改为 recMusictext,内容修改为"今日为你推荐",minimumSize 和maximumSize 的高度均修改为 30,Font 大小修改为 18;Widget 的 objectName 修改为 recMusicBox

④ 再拖拽一个 QLabel 和 Widget ,QLabel 的 objectName 修改为 supplyMusicText ,内容修改为"你的音乐补给站", minimumSize 和 maximumSize 的高度均修改为 30,Font 大小修改为18;Widget 的 objectName 修改为 supplyMusicBox。

⑤ 最后选中 QScrollArea,点击垂直布局。

3.2.3、自定义 recBox

RecBox 界面布局:

① 新添加设计师界面,命名为 RecBox。geometry 的宽高修改为:685*440。

② 添加三个Widget,objectName 依次修改为 leftPage、musicContent、rightPage;leftPage 和 rightPage 的 minimumSize 和 maximumSize 修改宽为 30,然后选中 RecBox 点击水平布局。将RecBox 的 margin 和 Spacing 修改为 0

③ 在 upPage 和 downPage 中各拖⼀个按钮,upPage 中按钮 objectName 修改为btUpminimumSize的高度修改为220;downPage 中按钮 objectName 修改为 btDownminimumSize 的高度修改为 220 ;然后选中 upPage 和 downPage 点击水平布局。将upPagedownPage 和的 margin 和 Spacing 修改为 0。

④ 在 musicContent 中拖两个 Widget,objectName 依次修改为 recListUp 和 recListDown,然后选中 musicContent 点击垂直布局,将 musicContent 的 margin 和 Spacing 修改为 0。(为了看清楚效果可临时将 recListUp 背景色设置为:background-color:green; 将 recListDown 背景色设置为:background-color:red;)

⑤ 在 recListUp 和 recListDown 中分别拖两个水平布局器,依次命名为 recListUpHLayout 和
recListDownHLayout,选中 recListUp 和 recListDown 点击水平布局,将 margin 和 Spacing 修改为 0 按钮添加如下 QSS 美化:

3.2.4、自定义 recBoxItem

RecBoxItem 界面布局:添加⼀个 Designer 界面,命名为 RecBoxItem,geometry 的宽和高设置为:150 * 200。

① 拖拽⼀个 Widget 到 RecBoxItem 中,objectName 修改为 musicImageBox,minimumSize 和maximumSize 的高度均修改为150;

② 拖拽⼀个 QLabel 到 Widget 中,objectName 修改为 recBoxItemText ,文本设置为"荐-001",QLabel 的 alignment 属性设置为水平、垂直居中。

③ 拖拽⼀个 QLabel 到 musicImageBox 中,objectName 修改为 recMusicImage, geometry 设置为:[(0, 0), 150*150]

④ 拖拽一个 QPushButton 到 musicImageBox 中,objectName 修改为 recMusicBtn ,删除掉文本内容。在属性中找到 cursor,点击选择小手图标

RecBoxItem 测试:

// recBox.cpp构造函数中添加如下代码
RecBoxItem* item = new RecBoxItem();
ui->recListUpHLayout->addWidget(item);

RecBoxItem 类中添加动画效果:

  • 在RecBoxItem类中拦截鼠标进入和离开事件,在进入时让图片上移,在离开时让图片下移回到原位
  • 该类中还需要添加设置推荐文本和图片的方法,将来需要在外部来设置每个 RecBoxItem 的文本和图片

3.2.5、RecBox 添加 RecBoxItem

图片路径和推荐文本准备:

每个 RecBoxItem 都有对应的图片和推荐文本,在往 RecBox 中添加 RecBoxItem 前需要先将图片路径和对应文本准备好。由于图片和文本具有对应关系,可以以键值对方式来进进组织,以下实现的时采用 QT 内置的 QJsonObject 对象管理图片路径和文本内容。

QJsonObject类:
头⽂件: 
// 功能: 插⼊键值对,如果key已经存在,则⽤value更新与key对应的value
// 返回值:返回指向新插⼊项的键值对
QJsonObject::iterator insert(const QString &key, const QJsonValue &value);
// 功能:获取与key对应的value
// 返回值:返回的value⽤QJsonValue对象组织
QJsonValue QJsonObject::value(const QString &key) const

QJsonArray类:
作⽤:管理的是QJsonValue对象
头⽂件:
该类重载了[]运算符,可以通过下标⽅式获取管理的QJsonValue对象
QJsonValue operator[](int i) const
QJsonValueRef operator[](int i)
// 往QJsonArray中插⼊⼀个QJsonValue对象
void append(const QJsonValue &value)

QJsonValue类
// 单参构造⽅法,将QJsonObject对象转换为QJsonValue对象
QJsonValue(const QJsonObject &o)
// 将内部管理的数据转化成QJsonObject返回
QJsonObject toObject() const
// 将内部管理的数据转化成QString返回
QString toString() const

recBox 中添加元素:

由于 recPage 页面中有两个 RecBox 控件,上面的 RecBox 为一行四列,下方的 RecBox 为 2 行四列,因此在 RecBox 类中增加以下成员变量:

// RecBox.h 新增
#include 
public:
    void initRecBoxUi(QJsonArray data, int row);

private:
    int row;
    // 记录当前RecBox实际总⾏数
    int col;
    // 记录当前RecBox实际每⾏有⼏个元素
    QJsonArray imageList; // 保存界⾯上的图⽚, ⾥⾯实际为key、value键值对

3.2.6、RecBox 中 btUp 和 btDown 按钮 clicked 处理

添加槽函数:

选中 recbox.ui 文件,分别选中 btUp 和 btDown,右键单击弹出菜单选择转到槽,选中 clicked 确定,btUp 和 btDown 的槽函数就添加好了。

void RecBox::on_btUp_clicked()
{
// 点击btUp按钮,显⽰前4张图⽚,如果已经是第⼀张图⽚,循环从后往前显⽰
}
void RecBox::on_btDown_clicked()
{
// 点击btUp按钮,显⽰前8张图⽚,如果已经是第⼀张图⽚,循环从后往前显⽰
}

imageList 中图片分组:

假设 imageList 中 有 24 组图片路径和推荐文本信息,如果将信息分组:

  • 如果是 recMusicBox ,将元素按照 co l分组,即每 4 个元素为⼀组,可分为 6 组;如果是supplyMuscBox,将元素按照 col 分组,即每 8 个元素为一组,可分为 3 组。
  • RecBox 类中添加 currentIndex 和 count 整形成员变量,currentIndex 记录当前显示组,count 记录总的信息组数。当点击 btUp 时,currentIndex--,显示前一组,如果 currentIndex小于 0 时,将其设置为 count-1;当点击 btDown 按钮时,currentIndex++ 显示下⼀组,当currentIndex为count 时,将 count 设置为 0.

元素重复分析:

每次 btUp 和 btDown 点击后,应该显示前一组和后一组图片,由于之前 recListUpHLayout 和
recListDownHLayout中 已经有元素了,因此需要先将之前的元素删除掉。

void RecBox::createRecBoxItem()
{
    // 溢出掉之前旧元素
    QList recUpList = ui->recListUp->findChildren();
    for(auto e : recUpList)
    {
        ui->recListUpHLayout->removeWidget(e);
        delete e;
    }
QList recDownList = ui->recListDown->findChildren
();
    for(auto e : recDownList)
    {
        ui->recListDownHLayout->removeWidget(e);
        delete e;
    }
    // 创建RecBoxItem对象,往RecBox中添加
    // ...
}

按照分组计算 imageList 中元素偏移:

程序启动时图片随机显示:

仔细观察发现,每次程序启动时,显示的图片都是相同的,这是因为 random_shuffle 在随机打乱元素时,需要设置随机数种子,否则默认使用的种子是相同的,就导致每次打乱的结果都是相同的,所以每次程序启动时 RecBox 中显示的内容都是相同的,因此在 randomPiction() 调用之前需要设置随机数种子。

// QQMusic类的initUi函数中新增
void QQMusic::initUi()
{
    // ...
    // 本地下载BtForm动画默认显⽰
    ui->local->showAnimal();
    ui->stackedWidget->setCurrentIndex(4);
    // 设置RecBox图⽚、⾏数
    srand(time(NULL));
    ui->recMusicBox->initRecBoxUi(randomPiction(), 1);
    ui->supplyMuscBox->initRecBoxUi(randomPiction(), 2);
}

3.3、自定义 CommonPage


3.3.1、CommonPage 页面分析

我的音乐下的:

我喜欢、本地下载、最近播放三个按钮表面上看对应三个 Page 页面,分析之后发现,这三个Page 页面实际是雷同的,因此只需要定义⼀个页面 CommonPage ,将 stackedWidget 中这三个页面的类型提升为 CommonPage 即可。

上图为本地音乐的 Page 页面,对页面拆解后,发现该页面可以分四部分:

① 页面说明,比如:本地音乐,该部分实际就是 QLabel 的提示说明;

② 正在播放音乐图片和播放全部按钮;

③ 音乐列表中每个部分的文本提示,实际就是三个 QLabel

④ 本页面对应的音乐列表,即 QListWidget 。

3.3.2、CommonPage 页面布局

新增加一个设计界面,objectName 修改为 CommonPage,geometry 的宽高修改为 800*500:

① 拖拽⼀个QLabel、两个 Widget 和⼀个 List View 控件到 CommonPage 中,objectName 从上往下依次修改为 pageTittle 、musicPlayBox、listLabelBox、pageMusicList,然后选中CommonPage 点击垂直布局:

  • 将 CommonPage 的 margin 和 Spacing 修改为 0。
  • pageTittle 的 minimumSize 和 maximumSize 的高度修改为 30。
  • musicPlayBox 的 minimumSize 和 maximumSize 的高度修改为 150。
  • listLabelBox 的 minimumSize 和 maximumSize 的高度修改为 40。

② 将 pageTittle 的文本内容修改为"本地音乐"

③ musicPlayBox 中拖拽一个 QLabel,objectName 修改为 musicImageLabel,minimumSize和 maximumSize 的宽度修改为 150

④ listLabelBox 中拖拽三个 QLabel,内容依次修改为:歌曲名称、歌手名称、专辑名称

⑤ 选中 List View,右键单击弹出菜单中选择"变形为",选择 QListWidget

3.3.3、CommonPage 界面设置和显示

CommonPage 页面是我喜欢、本地下载、最近播放三个界面的共同类型,因此该类需要提供设置:pageTittle 和 musicImageLabel 的公共方法,将来在程序启动时完成三个界面信息的设置,因此CommonPage 类需要添加一个 public 的 setCommonPageUI 函数

// commonpage.h 中新增
public:
    void setCommonPageUI(const QString &title, const QString &image);

// commonpage.cpp 中新增
void CommonPage::setCommonPageUI(const QString &title, const QString &image)
{
    // 设置标题
    ui->pageTittle->setText(title);
    // 设置封⾯栏
    ui->musicImageLabel->setPixmap(QPixmap(image));
    ui->musicImageLabel->setScaledContents(true);
}

界面设置的函数需要在程序启动时就完成好配置,即需要在 QQMusic 的 initUi() 函数中调用完成设置:

void Widget::initUi()
{
    ....
    // 设置我喜欢、本地⾳乐、最近播放⻚⾯
    ui->likePage->setCommonPageUI("我喜欢", ":/images/ilikebg.png");
    ui->localPage->setCommonPageUI("本地⾳乐", ":/images/localbg.png");
    ui->recentPage->setCommonPageUI("最近播放", ":/images/recentbg.png");
}

3.4、自定义 ListItemBox


3.4.1、ListItemBox 页面分析

CommonPage 页面创建好之后,等音乐加载到程序之后,就可以将音乐信息往 CommonPage 的 pageMusicList 中显示了。

上图每行都是 QListWidget 中的一个元素,每个元素中包含多个控件:

① 收藏图标,即QLabel

② 歌曲名称,即QLabel

③ VIP 和 SQ,VIP 即收费会员专享,SQ 为无损音乐,也是两个 QLabel

④ 歌手名称,即 QLabel

⑤ 音乐专辑名称,即 QLabel

此处,需要将上述所有 QLabel 组合在⼀起,作为一个独立的控件,添加到 QListWidget 中,因此该控件也需要自定义。

3.4.2、ListItemBox 页面布局 

添加一个设计师界面,objectName 为 ListItemBox,geometry 的宽度和高度修改为 800*45:

3.4.3、ListItemBox 显示测试

ListItemBox 将来要添加到 CommonPage 页面中的 QListWidget 中,因此在 CommonPage 类的初始化方法中添加如下代码:

#include "listitembox.h"

void CommonPage::setCommonPageUI(const QString &title, const QString &image)
{
    // 设置标题
    ui->pageTittle->setText(title);
    // 设置封⾯栏
    ui->musicImageLabel->setPixmap(QPixmap(image));
    ui->musicImageLabel->setScaledContents(true);
    // 测试
    ListItemBox* listItemBox = new ListItemBox(this);
    QListWidgetItem* listWidgetItem = new QListWidgetItem(ui->pageMusicList);
    listWidgetItem->setSizeHint(QSize(ui->pageMusicList->width(), 45));
    ui->pageMusicList->setItemWidget(listWidgetItem, listItemBox);
}

3.4.4、支持 hover 效果

ListItemBox 添加到 CommonPage 中的 QListWidget 之后,自带 hover 效果,但是背景颜色和界面不太搭配,此处重新实现 hover 效果,此处重写 enterEvent 和 leaveEvent 来实现 hover 效果。

// listitembox.h 新增
protected:
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);

// listitembox.cpp 新增
void ListItemBox::enterEvent(QEvent *event)
{
    (void)event;
    setStyleSheet("background-color:#EFEFEF");
}
void ListItemBox::leaveEvent(QEvent *event)
{
    (void)event;
    setStyleSheet("");
}

3.5、自定义 MusicSlider

由于 QT 内置的 Horizontal Slider (水平滑竿)不是很好看,该控件也采用自定义。

① 添加⼀个设计师界面,objectName 修改为 MusicSlider,geometry 修改为 800*20。

② 拖拽⼀个 QFrame,objectName 修改为 inLine,geometry 修改为 [(0,8), 800*4]。

③ 拖拽⼀个 QFrame,objectName 修改为 outLine,geometry 修改为 [(0,8), 400*4]。

④ 选中 MusicSlider,点击水平布局。

⑤ inLine 和 outLine 的样式设置如下:

⑥ 打开 QQMusic.ui,选中 progressBar 清除之前样式,将 progressBar 提升为 MusicSlider ,运行程序就能看到效果。

3.6、自定义 VolumeTool


3.6.1、VolumeTool 控件分析

音量调节控件本来也可以使用 Qt 内置的垂直滑杆来代替,只是垂直滑杆不好看,因此也自定义:

① 内部为类似 MusicSlider 控件 + 小圆球,圆球实际为一个 QPushButton[661630]

② 音量大小文本显示,实际为 QLabel

③ QPushButton ,点击之后在静⾳和取消静音切换

④ 一个倒三角,Qt 未提供三角控件,该控件需要手动绘制,用来提示是播放控制区那个按钮按下的

3.6.2、VolumeTool 界面布局

3.6.3、界面设置

该控件属于弹出窗口,即点击了主界面的音量调节按钮后,才需要弹出该界面,点击其他位置该界面自动隐藏。因此在窗口创建时,需要设置窗口为无边框以及为弹出窗口。

// VolumeTool.cpp 的构造函数中添加如下代码
#include 

VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool)
{
    ui->setupUi(this);
    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint|
    Qt::NoDropShadowWindowHint);
    // 在windows上,设置透明效果后,窗⼝需要加上Qt::FramelessWindowHint格式
    // 否则没有控件位置的背景是⿊⾊的
    // 由于默认窗⼝有阴影,因此还需要将窗⼝的原有的阴影去掉,窗⼝需要加上
    Qt::NoDropShadowWindowHint
    setAttribute(Qt::WA_TranslucentBackground);
    // ⾃定义阴影效果
    QGraphicsDropShadowEffect* shadowEffect = new
    QGraphicsDropShadowEffect(this);
    shadowEffect->setOffset(0, 0);
    shadowEffect->setColor("#646464");
    shadowEffect->setBlurRadius(10);
    setGraphicsEffect(shadowEffect);
    // 给按钮设置图标
    ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));
    // ⾳量的默认⼤⼩是20
    ui->outLine->setGeometry(ui->outLine->x(), 180 - 36 - 25, ui->outLine->width(), 20);
    ui->silderBtn->move(ui->silderBtn->x(), ui->outLine->y() - ui->silderBtn->height()/2);
    ui->volumeRatio->setText("20%");
}

3.6.4、界面创建及弹出

音量调节属于主界面上元素,因此在 QQMusic 类中需要添加 VolumeTool 的对象,在 initUi 中 new 该类的对象。主界面中音量调节按钮添加 clicked 槽函数。

// qqmusic.h中新增
#include "volumetool.h"
VolumeTool* volumeTool;

// qqmusic.cpp中新增
void QQMusic::initUi()
{
    // ...
    // 创建⾳量调节窗⼝对象并挂到对象树
    volumeTool = new VolumeTool(this);
}

void QQMusic::on_volume_clicked()
{
    // 先要调整窗⼝的显⽰位置,否则该窗⼝在主窗⼝的左上⻆
    // 1. 获取该按钮左上⻆的图标
    QPoint point = ui->volume->mapToGlobal(QPoint(0,0));
    // 2. 计算volume窗⼝的左上⻆位置
    // 让该窗⼝显⽰在⿏标点击的正上⽅
    // ⿏标位置:减去窗⼝宽度的⼀半,以及⾼度恰巧就是窗⼝的左上⻆
    QPoint volumeLeftTop =  point - QPoint(volumeTool->width()/2, volumeTool->height());
    // 微调窗⼝位置
    volumeLeftTop.setY(volumeLeftTop.y()+30);
    volumeLeftTop.setX(volumeLeftTop.x()+15);
    // 3. 移动窗⼝位置
    volumeTool->move(volumeLeftTop);
    // 4. 将窗⼝显⽰出来
    volumeTool->show();
}

3.6.5、绘制三角

由于 Qt 中并未给出三角控件,因此三角需要手动绘制,故在 VolumeTool 类中重写 paintEvent 事件函数。

// volumetool.h中新增
void paintEvent(QPaintEvent *event);

// volumetool.cpp中新增
#include 

void VolumeTool::paintEvent(QPaintEvent *event)
{
    (void)event;
    // 1. 创建绘图对象
    QPainter painter(this);
    // 2. 设置抗锯⻮
    painter.setRenderHint(QPainter::Antialiasing, true);
    // 3. 设置画笔
    // 没有画笔时:画出来的图形就没有边框和轮廓线
    painter.setPen(Qt::NoPen);
    // 4. 设置画刷颜⾊
    painter.setBrush(Qt::white);
    // 创建⼀个三⻆形
    QPolygon polygon;
    polygon.append(QPoint(30, 300));
    polygon.append(QPoint(70, 300));
    polygon.append(QPoint(50, 320));
    // 绘制三⻆形
    painter.drawPolygon(polygon);
}

四、结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

本文地址:https://www.vps345.com/10257.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP docker 容器 运维 java-rabbitmq java 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 服务器 linux 游戏 云计算 网络工程师 网络管理 软考 2024 2024年上半年 下午真题 答案 deepseek DeepSeek-R1 API接口 物联网 ubuntu Deepseek Deepseek-R1 大模型 私有化部署 推理模型 RTSP xop RTP RTSPServer 推流 视频 c语言 英语 人工智能 redis Ollama Qwen2.5-coder 离线部署 django 神经网络 深度学习 计算机视觉 卷积神经网络 阿里云 网络 网络安全 网络协议 llama 算法 opencv 自然语言处理 语言模型 CH340 单片机 嵌入式硬件 串口驱动 CH341 uart 485 centos gcc centos 7 ssh tcp/ip ip协议 DNS macos windows conda YOLO pytorch vscode python yolov5 php 开发语言 javascript 前端 chrome edge ddos android web安全 模型联网 API CherryStudio Ubuntu 开发环境 vue.js spring boot nginx 笔记 网络结构图 https 经验分享 harmonyos 华为 数据库系统 MCP jvm 虚拟机 学习 学习方法 mysql adb 进程 操作系统 进程控制 pycharm ide 负载均衡 tomcat 游戏引擎 部署 计算机外设 bug ai nlp node.js virtualenv 策略模式 c++ typescript 计算机网络 dify 知识库 本地化部署 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 jenkins gitee 后端 机器学习 arm开发 架构 ui 自动化 数据库 oracle 关系型 安全 分布式 eureka apache fstab jellyfin nas 并查集 leetcode 智能路由器 外网访问 内网穿透 端口映射 udp 本地环回 bind ubuntu 18.04 安装教程 云原生 ip USB转串口 科技 个人开发 鸿蒙 mcu asm gnu 高级IO epoll kubernetes prometheus grafana fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse debian PVE 华为云 HarmonyOS Next AI编程 live555 rtsp rtp spring 媒体 websocket AI Dify UEFI Legacy MBR GPT U盘安装操作系统 opengl pillow grub 版本升级 扩容 qt QT 5.12.12 QT开发环境 Ubuntu18.04 多线程 TCP WebServer 数据分析 进程优先级 调度队列 进程切换 vnc yum docker-compose docker compose pygame matplotlib fonts-noto-cjk Linux 维护模式 outlook 错误代码2603 无网络连接 2603 虚拟显示器 远程控制 监控k8s集群 集群内prometheus ffmpeg 音视频 视频编解码 pip ssh漏洞 ssh9.9p2 CVE-2025-23419 openvpn server openvpn配置教程 centos安装openvpn windows 服务器安装 C 环境变量 进程地址空间 Linux PID 安卓模拟器 mac perf c# AIGC 人工智能生成内容 spring cloud kafka AI大模型 大模型技术 本地部署大模型 dubbo 面试 聚类 json compose 持续部署 maven svn 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 快捷键 旋转屏幕 自动操作 kylin Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 zotero WebDAV 同步失败 代理模式 VMware 课程设计 虚拟现实 JAVA Java xcode LDAP ollama llm ue4 着色器 ue5 虚幻 devops elasticsearch 目标跟踪 目标检测 OpenVINO 推理应用 cron crontab日志 git 思科 react.js 前端面试题 C# MQTTS 双向认证 emqx github 大数据 spark hive arm Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 transformer 运维开发 uni-app vim ragflow 1024程序员节 k8s 信息与通信 电脑 软件需求 stm32 ros 机器人 话题通信 服务通信 Hyper-V WinRM TrustedHosts 华为认证 交换机 开源 ssl webdav 多层架构 解耦 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK ecmascript nextjs react reactjs flask 嵌入式 linux驱动开发 vr oracle fusion oracle中间件 flutter 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 remote-ssh 微信 微信分享 Image wxopensdk 程序人生 DeepSeek 压测 ECS vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 tcp WSL2 Ubuntu22.04 虚拟化 开发人员主页 bash redhat odoo 服务器动作 Server action MacMini Mac 迷你主机 mini Apple axure 富文本编辑器 protobuf 序列化和反序列化 安装 Dell R750XS 虚拟局域网 WebUI DeepSeek V3 maxkb ARG 温湿度数据上传到服务器 Arduino HTTP 数据结构 cpu 内存 实时 使用 rabbitmq oceanbase 传统数据库升级 银行 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn 游戏程序 ios postman 测试工具 aws efficientVIT YOLOv8替换主干网络 TOLOv8 fork wait waitpid exit Ubuntu20.04 GLIBC 2.35 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 Agent LLM CrewAI list 多线程服务器 Linux网络编程 sql rust http 性能优化 网络药理学 生信 生物信息学 gromacs 分子动力学模拟 MD 动力学模拟 驱动开发 硬件工程 嵌入式实习 python2 ubuntu24.04 VMware安装mocOS macOS系统安装 vmware 卡死 华为od html Cline database unix 产品经理 agi microsoft rancher 浪潮信息 AI服务器 CPU 主板 电源 网卡 Cursor burp suite 抓包 IIS .net core Hosting Bundle .NET Framework vs2022 缓存 SRS 流媒体 直播 linux内核 powerpoint dell服务器 gateway Clion Nova ResharperC++引擎 Centos7 远程开发 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 .netcore lvm 磁盘挂载 磁盘分区 命令 区块链 nftables 防火墙 visual studio code 编辑器 intellij-idea 云电竞 云电脑 todesk TrueLicense C语言 rust腐蚀 VMware安装Ubuntu Ubuntu安装k8s 前端框架 私有化 本地部署 jupyter java-ee shell vSphere vCenter 软件定义数据中心 sddc 实时音视频 实时互动 Linux DevEco Studio 互信 audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 jmeter 软件测试 深度求索 私域 stm32项目 golang ocr 大语言模型 LLMs ubuntu20.04 开机黑屏 主从复制 etcd 数据安全 RBAC 链表 IM即时通讯 QQ 企业微信 剪切板对通 HTML FORMAT 软件工程 软件构建 报错 集成学习 集成测试 springsecurity6 oauth2 授权服务器 前后端分离 远程连接 rdp 实验 iftop 网络流量监控 Kali Linux 黑客 渗透测试 信息收集 vite milvus Google pay Apple pay elk AI-native Docker Desktop Alexnet filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 centos-root /dev/mapper yum clean all df -h / du -sh intellij idea 读写锁 创意 社区 ruoyi open webui VMware创建虚拟机 MacOS录屏软件 腾讯云 3d 数学建模 计算生物学 生物信息 基因组 rpc 国产数据库 瀚高数据库 数据迁移 下载安装 gpu算力 onlyoffice gitlab unity 串口服务器 大模型入门 大模型教程 notepad eclipse 热榜 hadoop 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 指令 ESP32 camera Arduino 电子信息 wsl 进程信号 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 numpy cursor chatgpt oneapi 离线部署dify 灵办AI sublime text pdf iot deepseek-r1 大模型本地部署 磁盘监控 内网渗透 靶机渗透 retry 重试机制 大模型微调 GameFramework HybridCLR Unity编辑器扩展 自动化工具 go 智能手机 权限 n8n 工作流 file server http server web server rag 大模型部署 DevOps 软件交付 数据驱动 应用场景 minicom 串口调试工具 搜索引擎 C++ x64 SIGSEGV SSE xmm0 frp log4j MS Materials KingBase 镜像下载 freebsd WSL2 上安装 Ubuntu qps 高并发 硅基流动 ChatBox jdk 软链接 硬链接 armbian u-boot 5G 3GPP 卫星通信 jar 交互 UOS 统信操作系统 mq rocketmq LLM Web APP Streamlit mybatis ip命令 新增网卡 新增IP 启动网卡 cuda 系统架构 WSL win11 无法解析服务器的名称或地址 回显服务器 UDP的API使用 Mac内存不够用怎么办 升级 CVE-2024-7347 漏洞 llama3 Chatglm 开源大模型 Linux的权限 flash-attention ansible selenium 正则表达式 远程工作 RustDesk自建服务器 rustdesk服务器 docker rustdesk WLAN burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 webstorm 统信 NFS Docker Hub docker pull 镜像源 daemon.json 迁移指南 监控k8s 监控kubernetes Samba SWAT 配置文件 服务管理 网络共享 vscode1.86 1.86版本 ssh远程连接 远程桌面 postgresql zip unzip CosyVoice 系统安全 ebpf uprobe IIS服务器 IIS性能 日志监控 强制清理 强制删除 mac废纸篓 爬虫 数据集 服务器扩容没有扩容成功 Mermaid 可视化图表 自动化生成 webrtc 高效I/O playbook 剧本 基础环境 网络爬虫 自动化运维 流水线 脚本式流水线 FTP 服务器 xml ipython su sudo gpt 视频平台 录像 视频转发 性能测试 视频流 存储 智能体 autogen openai coze 程序员创富 edge浏览器 矩阵 ROS PX4 MAVROS 四旋翼无人机 AI写作 rime VSCode 工业4.0 YOLOv8 NPU Atlas800 A300I pro asi_bench 客户端 命名管道 客户端与服务端通信 博客 c 工具 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 clickhouse 远程 执行 sshpass 操作 v10 软件 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 vmamba linux上传下载 Trae IDE AI 原生集成开发环境 Trae AI JDK LInux Windows 自动化编程 openwrt Kylin-Server 国产操作系统 服务器安装 Ubuntu共享文件夹 共享目录 Linux共享文件夹 信号 内核 显示器 curl wget express p2p RAGFLOW mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 Web服务器 多线程下载工具 网络编程 PYTHON ros2 moveit 机器人运动 VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 安装MySQL dns 嵌入式系统开发 ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 googlecloud selete 远程服务 wireshark 显示过滤器 ICMP Wireshark安装 copilot linux环境变量 android studio 全文检索 图搜索算法 环境配置 通信工程 毕业 系统 黑苹果 数据挖掘 低代码 网络用户购物行为分析可视化平台 大数据毕业设计 zabbix mariadb 实战案例 iperf3 带宽测试 openEuler openstack Xen KVM Docker Compose html5 firefox kamailio sip VoIP 大数据平台 alias unalias 别名 毕设 TRAE 无人机 僵尸进程 一切皆文件 nac 802.1 portal sqlserver rc.local 开机自启 systemd 麒麟 程序 编程 性能分析 Chatbox Invalid Host allowedHosts vue 功能测试 自动化测试 ping++ Hive环境搭建 hive3环境 Hive远程模式 NAS Termux 政务 分布式系统 监控运维 Prometheus Grafana yaml Ultralytics 可视化 Redis Desktop nvm matlab samba 鲲鹏 昇腾 npu MCP server C/S 大模型应用 npm CPU 使用率 系统监控工具 linux 命令 tcpdump Mac软件 kali 共享文件夹 sysctl.conf vm.nr_hugepages 7z 中间件 iis seatunnel 腾讯云大模型知识引擎 harmonyOS面试题 安防软件 宝塔面板无法访问 大屏端 SSH 密钥生成 SSH 公钥 私钥 生成 H3C shell脚本免交互 expect linux免交互 云原生开发 K8S k8s管理系统 Linux的基础指令 硬件架构 Python glibc 云服务 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 个人博客 浏览器自动化 沙盒 .net 云桌面 微软 AD域控 证书服务器 开发 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos visual studio 豆瓣 追剧助手 迅雷 c/c++ 串口 unity3d 银河麒麟 kylin v10 麒麟 v10 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 王者荣耀 ESXi YOLOv12 ubuntu24.04.1 HiCar CarLife+ CarPlay QT RK3588 模拟实现 ux nohup 异步执行 okhttp 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 vu大文件秒传跨域报错cors top Linux top top命令详解 top命令重点 top常用参数 文件系统 路径解析 HCIE 数通 firewalld 代码调试 ipdb threejs 3D 微信小程序 MQTT协议 消息服务器 代码 图像处理 自动驾驶 视觉检测 源码剖析 rtsp实现步骤 流媒体开发 压力测试 机柜 1U 2U Windsurf Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer mongodb netty DIFY 远程看看 远程协助 ragflow 源码启动 直播推流 sqlite3 微服务 springcloud Reactor 设计模式 状态管理的 UDP 服务器 Arduino RTOS bcompare Beyond Compare 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 Cookie GPU cudnn anaconda 版本 gradle 物联网开发 MQTT IO 网易邮箱大师 springboot 云耀服务器 OpenManus 匿名管道 KylinV10 麒麟操作系统 Vmware 隐藏文件 隐藏目录 管理器 通配符 执法记录仪 智能安全帽 smarteye linux安装配置 IPMI tar miniapp 真机调试 调试 debug 断点 网络API请求调试方法 kind CLion ros1 Noetic 20.04 apt 安装 键盘 统信UOS bonding 链路聚合 中兴光猫 换光猫 网络桥接 自己换光猫 SSH Xterminal iBMC UltraISO CentOS windows日志 端口号 开放端口 访问列表 GCC aarch64 编译安装 HPC 安卓 fpga开发 智慧农业 开源鸿蒙 团队开发 磁盘清理 鸿蒙系统 程序员 设置代理 实用教程 其他 Linux权限 权限命令 特殊权限 rsyslog 日志分析 系统取证 conda配置 conda镜像源 SSH 服务 SSH Server OpenSSH Server 图形化界面 换源 国内源 Debian k8s部署 MySQL8.0 高可用集群(1主2从) pyicu dba 自动化任务管理 职场和发展 XFS xfs文件系统损坏 I_O error 命令行 基础入门 visualstudio prompt easyui langchain 测试用例 VPN wireguard X11 Xming 推荐算法 web fd 文件描述符 蓝耘科技 元生代平台工作流 ComfyUI 飞牛nas fnos Docker快速入门 wsl2 稳定性 看门狗 智能电视 Typore yum源切换 更换国内yum源 trae FunASR ASR minio 文心一言 Spring Security 大版本升 升级Ubuntu系统 EasyConnect 具身智能 Isaac Sim 虚拟仿真 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 Xinference RAGFlow AimRT 流式接口 web3.py 计算机 远程过程调用 Windows环境 Wi-Fi Ardupilot 分析解读 sublime text3 docker命令大全 ci/cd 教程 环境搭建 Maven DocFlow 交叉编译 SysBench 基准测试 ArkTs ArkUI openssl ubuntu24 vivado24 Office r语言 数据可视化 框架搭建 css css3 ssrf 失效的访问控制 免费域名 域名解析 MNN Qwen SSL证书 ftp 边缘计算 ELF加载 Linux环境 深度优先 图论 并集查找 换根法 树上倍增 语音识别 xrdp Dell HPE 联想 浪潮 小艺 Pura X ShapeFile GeoJSON Nginx excel cmake 影刀 #影刀RPA# Netty 即时通信 NIO 群晖 gaussdb llama.cpp 环境迁移 宠物 毕业设计 免费学习 宠物领养 宠物平台 asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 AI作画 宝塔 华为证书 HarmonyOS认证 华为证书考试 实习 思科模拟器 Cisco nuxt3 大模型面经 大模型学习 AnythingLLM AnythingLLM安装 gitea WebVM 微信公众平台 VR手套 数据手套 动捕手套 动捕数据手套 rpa muduo ufw 飞牛 HistoryServer Spark YARN jobhistory Ark-TS语言 银河麒麟服务器操作系统 系统激活 python3.11 单例模式 算力 kvm qemu libvirt 服务器管理 宝塔面板 配置教程 网站管理 cmos 硬件 金仓数据库 2025 征文 数据库平替用金仓 Socket can 线程池 考试 mamba scapy 输入法 磁盘 空间 查错 av1 电视盒子 机顶盒ROM 魔百盒刷机 电视剧收视率分析与可视化平台 社交电子 sonoma 自动更新 ssh远程登录 virtualbox vscode 1.86 网站搭建 serv00 neo4j 数据仓库 数据库开发 数据库架构 服务器部署 本地拉取打包 直流充电桩 充电桩 微信开放平台 微信公众号配置 重启 排查 系统重启 日志 原因 信号处理 远程登录 telnet 可信计算技术 安全威胁分析 蓝桥杯 服务器时间 chfs ubuntu 16.04 实时内核 显示管理器 lightdm gdm keepalived 双系统 kotlin iphone ArcTS 登录 ArcUI GridItem export env 变量 docker run 数据卷挂载 交互模式 arkUI CNNs 图像分类 论文阅读 NAT转发 NAT Server js 网络穿透 云服务器 火绒安全 Nuxt.js grep chrome devtools chromedriver lighttpd安装 Ubuntu配置 Windows安装 服务器优化 HarmonyOS NEXT 原生鸿蒙 arcgis k8s集群资源管理 nacos 弹性计算 裸金属服务器 弹性裸金属服务器 相机 sudo原理 su切换 banner Webserver 异步 小智 致远OA OA服务器 服务器磁盘扩容 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 软件卸载 系统清理 iTerm2 终端 etl esp32 蓝牙 网络攻击模型 技能大赛 rustdesk scikit-learn 系统开发 binder 车载系统 framework 源码环境 网卡的名称修改 eth0 ens33 deep learning 毕昇JDK eNSP 网络规划 VLAN 企业网络 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 本地部署AI大模型 多产物 半虚拟化 硬件虚拟化 Hypervisor Kali 能力提升 面试宝典 技术 IT信息化 yolov8 Web应用服务器 服务器配置 Reactor反应堆 行情服务器 股票交易 速度慢 切换 股票量化接口 股票API接口 micropython mqtt dity make termux HarmonyOS OpenHarmony 小游戏 五子棋 sdkman 密码学 常用命令 文本命令 目录命令 业界资讯 端口测试 模拟退火算法 田俊楠 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm Linux Vim mosquitto 消息队列 searxng dash Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 图形渲染 import save load 迁移镜像 网络文件系统 ajax nvidia pyside6 界面 cfssl umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 ueditor导入word ueditor导入pdf ueditor导入ppt AISphereButler NVML nvidia-smi 拓扑图 CentOS Stream systemctl composer UDP 产测工具框架 IMX6ULL 管理框架 联网 easyconnect 代理 代码托管服务 firewall 桌面环境 混合开发 环境安装 FTP服务器 Playwright Carla 智能驾驶 Jellyfin Java Applet URL操作 服务器建立 Socket编程 网络文件读取 P2P HDLC openjdk ukui 麒麟kylinos openeuler 健康医疗 互联网医院 W5500 OLED u8g2 TCP服务器 mysql离线安装 ubuntu22.04 mysql8.0 Ubuntu 22.04 MySql 算家云 算力租赁 源码 Pyppeteer webgl diskgenius 信息可视化 echarts ArkTS 移动端开发 考研 在线office VPS RAID RAID技术 京东云 玩游戏 asp.net大文件上传下载 强化学习 OD机试真题 华为OD机试真题 服务器能耗统计 DeepSeek行业应用 Heroku 网站部署 big data opensearch helm ceph WebRTC uniapp 游戏机 AI代码编辑器 恒源云 lb 协议 ROS2 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 beautifulsoup kernel 安全架构 聊天服务器 套接字 显卡驱动 智能音箱 智能家居 IPMITOOL BMC 硬件管理 计算机系统 rclone AList fnOS next.js 部署next.js linuxdeployqt 打包部署程序 appimagetool gpt-3 大模型训练/推理 推理问题 mindie 向日葵 netlink libnl3 金融 繁忙 服务器繁忙 解决办法 替代网站 汇总推荐 AI推理 飞牛NAS 飞牛OS MacBook Pro 移动云 CDN 终端工具 远程工具 cnn token sas 邮件APP 免费软件 容器技术 序列化反序列化 Ubuntu Server Ubuntu 22.04.5 jina IPv4 子网掩码 公网IP 私有IP Linux24.04 deepin ruby 线程 Xshell 代码规范 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 embedding safari 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 银河麒麟操作系统 国产化 MobaXterm 文件传输 hibernate 历史版本 下载 wsgiref Web 服务器网关接口 nfs 服务器部署ai模型 SSL 域名 skynet springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 Kylin OS 工具分享 java-rocketmq 机架式服务器 1U工控机 国产工控机 同步 备份 建站 LORA NLP 图文教程 VMware虚拟机 macOS系统安装教程 macOS最新版 虚拟机安装macOS Sequoia autoware GRUB引导 Linux技巧 stable diffusion make命令 makefile文件 黑客技术 URL api lio-sam SLAM CUPS 打印机 Qt5 uv 内网环境 监控 华为OD 可以组成网络的服务器 生活 大文件秒传跨域报错cors cpp-httplib 镜像 网工 自学笔记 小米 澎湃OS Android 服务器主板 AI芯片 MI300x 用户缓冲区 多进程 CORS 跨域 Node-Red 编程工具 流编程 less 支付 微信支付 开放平台 设备 PCI-Express wps 办公自动化 pdf教程 rnn SenseVoice vasp安装 fast AutoDL workflow string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 游戏服务器 TrinityCore 魔兽世界 图片增强 增强数据 文件分享 pppoe radius NPS 雨云服务器 雨云 Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 Attention db 渗透 Vmamba code-server 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 网页设计 ftp服务 文件上传 saltstack 相差8小时 UTC 时间 Qualcomm WoS QNN AppBuilder pyautogui ShenTong DBeaver 开机自启动 RAG 检索增强生成 文档解析 大模型垂直应用 虚拟机安装 医疗APP开发 app开发 三级等保 服务器审计日志备份 trea idea chatbox 模拟器 risc-v bot Docker EMQX 通信协议 React Next.js 开源框架 联想开天P90Z装win10 DeepSeek r1 Open WebUI 加解密 Yakit yaklang cd 目录切换 pyqt bootstrap 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? NLP模型 RTMP 应用层 ollama api ollama外网访问 apt 宕机切换 服务器宕机 Linux find grep tensorflow idm HP Anyware Obsidian Dataview adobe es6 qt6.3 g726 代理服务器 ollama下载加速 xpath定位元素 bat Minecraft opcua opcda KEPServer安装 DOIT 四博智联 源代码 数据管理 数据治理 数据编织 数据虚拟化 数码 联机 僵尸毁灭工程 游戏联机 开服 iDRAC R720xd 域名服务 DHCP 符号链接 配置 powerbi 跨平台 linux 命令 sed 命令 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 树莓派 VNC AD域 thingsboard 单元测试 iventoy VmWare OpenEuler 企业网络规划 华为eNSP 开源软件 星河版 僵尸世界大战 游戏服务器搭建 es vsxsrv Qwen3 qwen3 32b vllm crosstool-ng GIS 遥感 WebGIS 蓝桥杯C++组 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 SystemV 大模型压力测试 EvalScope MAC SecureCRT c/s GeneCards OMIM TTD uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 client-go k8s二次开发 多个客户端访问 IO多路复用 TCP相关API 技术共享 我的世界 我的世界联机 自定义客户端 SAS 查看显卡进程 fuser ArtTS IO模型 我的世界服务器搭建 deekseek comfyui comfyui教程 vpn jetty undertow 子系统 ISO镜像作为本地源 游戏开发 MacOS 负载测试 initramfs Linux内核 Grub 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 csrf perl wordpress 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 Erlang OTP gen_server 热代码交换 事务语义 Ubuntu 24.04.1 轻量级服务器 win服务器架设 windows server hugo word docker部署Python Helm k8s集群 AI员工 dns是什么 如何设置电脑dns dns应该如何设置 Python基础 Python教程 Python技巧 分布式训练 docker search 聊天室 localhost 券商 股票交易接口api 类型 特点 动静态库 AI agent Claude qt项目 qt项目实战 qt教程 冯诺依曼体系 LVM lvresize 磁盘扩容 pvcreate 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP 反向代理 DenseNet 状态模式 hosts figma 授时服务 北斗授时 增强现实 沉浸式体验 技术实现 案例分析 AR 智能体开发 GoogLeNet Qwen2.5-VL VS Code 虚幻引擎 xshell termius iterm2 AD 域管理 Echarts图表 折线图 柱状图 异步动态数据 鸿蒙开发 可视化效果 nosql 问题解决 SEO ecm bpm USB网络共享 nohup后台启动 小智AI服务端 xiaozhi TTS Sealos deepseak 豆包 KIMI 腾讯元宝 web3 区块链项目 服务网格 istio csrutil mac恢复模式进入方法 恢复模式 rsync 浏览器开发 AI浏览器 7-zip 进程间通信 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 合成模型 扩散模型 图像生成 minecraft 烟花代码 烟花 元旦 性能调优 安全代理 本地知识库部署 DeepSeek R1 模型 HTTP 服务器控制 ESP32 DeepSeek 知识图谱 备选 网站 调用 示例 查询数据库服务IP地址 SQL Server 网络建设与运维 网络搭建 神州数码 神州数码云平台 云平台 pthread 移动开发 网页服务器 web服务器 语法 iNode Macos 免密 公钥 私钥 弹性服务器 智能合约 哈希算法 kerberos sqlite pgpool react native 捆绑 链接 谷歌浏览器 youtube google gmail PPI String Cytoscape CytoHubba 电路仿真 multisim 硬件工程师 硬件工程师学习 电路图 电路分析 仪器仪表 Zoertier 内网组网 prometheus数据采集 prometheus数据模型 prometheus特点 TCP协议 抗锯齿 postgres Dify重启后重新初始化 论文笔记 银河麒麟高级服务器 外接硬盘 Kylin xfce UOS1070e 多路转接 WINCC Logstash 日志采集 regedit 开机启动 chromium dpi 服务器ssl异常解决 whistle 项目部署到linux服务器 项目部署过程 超融合 项目部署 ranger MySQL8.0 dock 加速 银河麒麟桌面操作系统 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 MDK 嵌入式开发工具 proxy模式 玩机技巧 软件分享 软件图标 飞书 shard Apache Beam 批流统一 案例展示 数据分区 容错机制 OpenSSH macbook IP配置 netplan 移动魔百盒 软考设计师 中级设计师 SQL 软件设计师 Headless Linux XCC Lenovo 根服务器 seleium EVE-NG IP 地址 计算机科学与技术 底层实现 llamafactory 微调 zookeeper 卸载 列表 Anolis nginx安装 linux插件下载 分布式账本 信任链 共识算法 ai工具 阿里云ECS ldap 对比 meld DiffMerge System V共享内存 进程通信 deepseek r1 达梦 DM8 junit 需求分析 规格说明书 支持向量机 架构与原理 安全漏洞 信息安全 mac设置host 内网服务器 内网代理 内网通信 h.264 新盘添加 partedUtil GRE gunicorn 软负载 用户管理 open Euler dde 阻塞队列 生产者消费者模型 服务器崩坏原因 Alist mount 挂载 网盘 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 navicat 端口 查看 ss Charles NVM Node Yarn PM2 打不开xxx软件 无法检查其是否包含恶意软件 deployment daemonset statefulset cronjob zerotier Unity Dedicated Server Host Client 无头主机 cocoapods arkTs SVN Server tortoise svn 锁屏不生效 数据采集 Crawlee g++ g++13 wpf 崖山数据库 YashanDB 可用性测试 集群管理 midjourney IMX317 MIPI H265 VCU 信创 信创终端 中科方德 商用密码产品体系 sentinel 搭建个人相关服务器 运维监控 佛山戴尔服务器维修 佛山三水服务器维修 GPU训练 钉钉 swoole 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 分子对接 autodock mgltools PDB PubChem laravel 材料工程 Trae叒更新了? 端口聚合 windows11 无桌面 做raid 装系统 Radius 音乐服务器 Navidrome 音流 抓包工具 Kubernetes 裸机装机 linux磁盘分区 裸机安装linux 裸机安装ubuntu 裸机安装kali 裸机 glm4 干货分享 黑客工具 密码爆破 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 qt5 客户端开发 tailscale derp derper 中转 autodl triton 模型分析 线性代数 电商平台 流量运营 可执行程序 嵌入式Linux IPC EMUI 回退 降级 docker desktop image IDEA 孤岛惊魂4 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 欧标 OCPP 软件开发 lua 单一职责原则 多端开发 智慧分发 应用生态 鸿蒙OS NVIDIA 机械臂 java-zookeeper IMM docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口服务器 kubeless 音乐库 源代码管理 post.io 企业邮箱 搭建邮箱 mysql安装报错 windows拒绝安装 管道 显卡驱动持久化 GPU持久化 笔灵AI AI工具 Unity插件 数字证书 签署证书 IPv6 IPv6测试 IPv6测速 IPv6检测 IPv6查询 解决方案 华为机试 静态IP massa sui aptos sei linux子系统 忘记密码 带外管理 风扇控制软件 rtc 李心怡 服务器正确解析请求体 fiddler xss VGG网络 卷积层 池化层 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 yum换源 金仓数据库概述 金仓数据库的产品优化提案 resolv.conf 创业创新 solr 计算虚拟化 弹性裸金属 MVS 海康威视相机 IPv4/IPv6双栈 双栈技术 网路规划设计 ensp综合实验 IPv4过渡IPv6 IPv4与IPv6 hdc hexo 粘包问题 线程同步 线程互斥 条件变量 PyQt PySide6 极限编程 mybase 计算机学习路线 编程语言选择 UFW 桥接模式 windows虚拟机 虚拟机联网 飞腾处理器 sequoiaDB solidworks安装 ABAP authing flink 输入系统 配置原理 存储维护 NetApp存储 EMC存储 ardunio BLE 海康 Bug解决 Qt platform OpenCV watchtower 大模型推理 设备树 macOS 网络原理 OpenCore servlet 北亚数据恢复 oracle数据恢复 动态规划 西门子PLC 通讯 Python 视频爬取教程 Python 视频爬取 Python 视频教程 Qt QModbus mcp服务器 client close webpack 程序化交易 量化交易 高频交易 HAProxy 大大通 第三代半导体 碳化硅 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 yashandb paddle ubuntu安装 linux入门小白 充电桩平台 充电桩开源平台 Masshunter 质谱采集分析软件 使用教程 科研软件 文件存储服务器组件 AI Agent 字节智能运维 node brew 搜狗输入法 中文输入法 NFC 近场通讯 智能门锁 tidb pycharm安装 火山引擎 WireGuard 异地组网 框架 RK3568 RDP AzureDataStudio Putty 花生壳 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 内存管理 qwen2vl Claude Desktop Claude MCP Windows Cli MCP 物理地址 页表 虚拟地址 mvc 桌面快捷方式 免费 元服务 应用上架 Linux的基础开发工具 STL 跨域请求 命令模式 零售 VM虚拟机 finebi element-ui 上传视频并预览视频 vue上传本地视频及进度条功能 vue2选择视频上传到服务器 upload上传视频组件插件 批量上传视频 限制单个上传视频 easyTier 组网 脚本 lrzsz homeassistant 三次握手 华为鸿蒙系统 ArkTS语言 Component 生命周期 条件渲染 Image图片组件 鸿蒙NEXT 向量数据库 安装部署 milvus安装 archlinux kde plasma AWS 华为昇腾910b3 logstash 百度云 矩池云 数据下载 数据传输 MinIO webview pythonai PlaywrightMCP CAD瓦片化 栅格瓦片 矢量瓦片 Web可视化 DWG解析 金字塔模型 设计规范 caddy photoshop vCenter服务器 ESXi主机 监控与管理 故障排除 日志记录 接口优化 d3d12 #STC8 #STM32 win向maOS迁移数据 vm DrissionPage 网络库 android-studio hosts文件管理工具 Maxkb RAG技术 本地知识库 ACL 流量控制 基本ACL 规则配置 知行EDI 电子数据交换 知行之桥 EDI gru deepseek-v3 ktransformers PTrade QMT 量化股票 finalsheel anythingllm open-webui docker国内镜像 欧拉系统 cpolar web开发 进程池实现 qtcreator 数据库管理 bigdata OS GRANT REVOKE 接口返回 匿名FTP 邮件传输代理 SSL支持 chroot监狱技术 cocos2d 3dcoat Metastore Catalog