一、界面效果

功能:

搜索歌曲:客户端用户输入歌曲名,点击显示歌曲信息,服务器根据客户端发送来的名字在歌曲表内查询查询到的话,则将对应的歌曲文件数据发送到客户端新创建的一个文件夹内,然后加入到多媒体播放。(最后关闭窗口会直接删除此文件夹)

添加歌单:客户端用户觉得搜索到的此首歌曲可以,可将该歌曲添加到服务器端自己的歌单表内。

下载歌曲:客户可根据搜索到的此首歌曲,将此歌曲下载到客户端内选择的文件夹内。

歌曲选择:客户可选择自己的本地下载过的歌曲加入列表播放。

显示歌单:客户端用户调用服务器数据库内自己的表,将表内歌单显示在客户端列表内。

播放选择:

通过歌曲选择在列表内的歌单

正常的播放/暂停,上下歌切换,进度条的调节,单曲/顺序/随机播放等

(注:歌曲列表显示的是服务器发送过来的数据 上下歌切换关闭)

部分代码:

音乐播放器界面:

#include "musicwin.h"
#include "ui_musicwin.h"
#include <QFileDialog>
#include <QTime>
#include <QTimer>
#include <QFileInfo>
#include <QDebug>
#include <QByteArray>
#include <network.h>
#include <QMessageBox>
#include <QtEndian>
#include <QtGlobal>
#include <winsock2.h>
#include<QTextCodec> //引入
#include <QPainter>
musicwin::musicwin(QWidget *parent) :QWidget(parent),ui(new Ui::musicwin)
{this->dirName = "C:\\Users\\Administrator\\Desktop\\QT_Project\\day4_musicWork\\TemporaryMusic";this->times = 0;this->j = 0;this->flag = 0;this->size = 0;this->all = 0;this->dirName = nullptr;this->file = NULL;this->row = 0;ui->setupUi(this);this->Icount = 0;this->n = 0;this->mediaPlayer = new QMediaPlayer(this);this->music = new QByteArray;this->music->clear();this->exist = -1;ui->label->setText("00:00/00:00");//设置播放/暂停的图标this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));//设置上一曲和下一曲的图标this->ui->pushButton_last->setIcon(this->style()->standardIcon(QStyle::SP_MediaSeekBackward));this->ui->pushButton_next->setIcon(this->style()->standardIcon(QStyle::SP_MediaSeekForward));//设置按钮图标this->ui->searchBtn->setIcon(QIcon(":/image/搜索.png"));this->ui->downloadBtn->setIcon(QIcon(":/image/下载.png"));this->ui->showBtn->setIcon(QIcon(":/image/查看.png"));this->ui->collectBtn->setIcon(QIcon(":/image/收藏.png"));this->ui->pushButton_choose->setIcon(QIcon(":/image/选择.png"));this->ui->pushButton->setIcon(QIcon(":/image/刷新.png"));//设置音量调节进度条的取值范围和初始值this->ui->volumeSlider->setRange(0, 100);this->ui->volumeSlider->setValue(30);this->timer = new QTimer(this);//设置编辑框后虚内容显示this->ui->searchEdit->setPlaceholderText("歌曲搜索");//绘制背景图QPalette pal = this->palette();pal.setBrush(QPalette::Background, QBrush(QPixmap(":/image/音乐.jpg")));setPalette(pal);//滚动显示歌曲名称connect(this->timer, SIGNAL(timeout()), this, SLOT(showMusicName()));//根据位置的变化来设置进度条的位置connect(this->mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(updatePlaySlider(qint64)));//根据时长的变化来获取播放的总时长设置给进度条的范围connect(this->mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(setPlaySliderRange(qint64)));
}musicwin::~musicwin()
{delete ui;
}void musicwin::on_pushButton_choose_clicked()
{//清空编辑框this->ui->searchEdit->clear();//如果选择本地歌曲设置上下切换为可按状态this->ui->pushButton_last->setEnabled(true);this->ui->pushButton_next->setEnabled(true);this->ui->listWidget->clear();//打开文件选择歌曲 获取歌曲路径加入列表this->fileList = QFileDialog::getOpenFileNames(this, "选择", ".", "MP3(*.MP3)");//默认选择的歌曲从第一首开始 获取路径this->musicPath = fileList.at(0);//获取根据路径获取名称QFileInfo fileInfo(musicPath);//显示第一首的歌曲信息 转换获取歌曲名this->musicName = fileInfo.fileName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//将选中的歌曲添加列表框内int i;for (i = 0; i < this->fileList.size(); i++){QFileInfo fileInfo(this->fileList.at(i));this->ui->listWidget->addItem(fileInfo.baseName());}//将第一首歌曲加入播放器中this->mediaPlayer->setMedia(QUrl(this->musicPath));//显示正在播放的歌曲this->ui->listWidget->setCurrentRow(0);//开始播放第一首音乐this->mediaPlayer->play();//启动定时器让歌曲名称进行滚动显示this->timer->start(1000);//播放开始的时候将播放的按钮由播放设置为暂停this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}
//滚动显示选中的歌曲名称
void musicwin::showMusicName()
{this->n++;if (this->n  == this->name.size()){this->n = 0;}this->ui->label_2->setText(this->name.mid(this->n));//显示总时长--毫秒qint64 dur = this->mediaPlayer->duration();//显示当前播放时长--毫秒qint64 pos = this->mediaPlayer->position();//实例化时间对象 动态显示时间QTime time1(0, 0, 0), time2(0, 0, 0);this->ui->label->setText(time1.addMSecs(int(pos)).toString("mm:ss") + "/"+ time2.addMSecs(int(dur)).toString("mm:ss"));//判断歌曲是否播放完成if (dur == pos){if ("顺序播放" == ui->comboBox->currentText()){this->n = ui->listWidget->currentRow();if (n == this->fileList.size() - 1){//再次从0开始n = -1;}//按照顺序执行列表框内的歌单this->musicPath = this->fileList.at(n + 1);//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//列表显示到歌曲名称this->ui->listWidget->setCurrentRow(n + 1);//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.fileName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);}else if ("循环播放" == ui->comboBox->currentText()){//循环播放 stop让这个播放器停止再次打开 从头开始 不改变其内容this->mediaPlayer->stop();this->mediaPlayer->play();}else if ("随机播放" == ui->comboBox->currentText()){//使用随机函数获取随机值int num = qrand() % (this->fileList.size() - 1);this->musicPath = this->fileList.at(num);//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//列表显示到歌曲名称this->ui->listWidget->setCurrentRow(num);//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.fileName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);}}
}
//修改播放进度条
void musicwin::updatePlaySlider(qint64 position)
{//根据歌曲的修改位置设置播放进度条的位置this->ui->viewSlider->setValue(int(position));
}void musicwin::setPlaySliderRange(qint64 duration)
{//根据选中歌曲的总范围设置播放进度条的设置this->ui->viewSlider->setRange(0, int(duration));
}
void musicwin::on_pushButton_play_clicked()
{//获取当前播放音乐的状态int state = this->mediaPlayer->state();//如果当前为播放状态if (state == QMediaPlayer::PlayingState){//设置播放器为暂停态this->mediaPlayer->pause();//修改按钮显示为暂停this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));}//如果当前为暂停态else if (state == QMediaPlayer::PausedState){//设置为播放器播放态this->mediaPlayer->play();//修改按钮显示为播放this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));}
}
//根据播放进度滑块的位置来设置歌曲播放的位置
void musicwin::on_viewSlider_sliderMoved(int position)
{this->mediaPlayer->setPosition(position);
}
//根据音量滑块的位置来设置歌曲播放的音量
void musicwin::on_volumeSlider_sliderMoved(int position)
{this->mediaPlayer->setVolume(position);
}
//上一首
void musicwin::on_pushButton_last_clicked()
{int pos = this->ui->listWidget->currentRow();if (0 == pos){//如果是第一首点击上一首则跳到最后一首pos = this->fileList.size();}//获取上一首的路径 也就是当前的减一 列表内的上一个this->musicPath = this->fileList.at(pos - 1);//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//列表显示到上一首歌曲名称this->ui->listWidget->setCurrentRow(pos - 1);//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.baseName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);
}void musicwin::on_pushButton_next_clicked()
{int pos = this->ui->listWidget->currentRow();if (pos == this->fileList.size() - 1){//如果是最后一首点击下一首则跳到第一首pos = -1;}//获取下一首的路径 也就是当前的加一 列表内的下一个this->musicPath = this->fileList.at(pos + 1);//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//列表显示到下一首歌曲名称this->ui->listWidget->setCurrentRow(pos + 1);//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.baseName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);
}
//双击列表框内切换歌曲
void musicwin::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{//获取当前列表内对应的第几行int pos = this->ui->listWidget->currentRow();//获取当前歌曲的路径this->musicPath = this->fileList.at(pos);qDebug() << pos;//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.baseName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);
}
//搜索歌曲
void musicwin::on_searchBtn_clicked()
{ui->label->setText("00:00/00:00");this->name = "    ";this->timer->stop();this->ui->listWidget->clear();//如果有音乐正在播放 一切内容清空//路径清空this->musicPath.clear();this->mediaPlayer->stop();QMessageBox::information(this, "提示框", "抱歉用户系统不够完善,请于最少10s后点击刷新进行歌曲播放");//获取套接字NetWork *w = NetWork::getNet();disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(showMyMusic()));disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(ensureCollect()));//读完缓存区内容QString recv = w->socket->readAll();//获取编辑框内容char str[100] = {'\0'};QByteArray data = this->ui->searchEdit->text().toUtf8();sprintf(str, "Search#%s", data.data());connect(w->socket, SIGNAL(readyRead()), this, SLOT(readData()));//将数据发送过去w->socket->write(str);
}void musicwin::readData()
{NetWork *w = NetWork::getNet();if (this->j == 0) //获取到歌曲名称{QByteArray data = w->socket->read(50);this->row = QString(data).toInt();if (this->row > 0){this->row = 0;//创建临时文件夹setDir();//UTF-8 GBK类型转换this->musicPath = this->dirName + "/" + this->ui->searchEdit->text() + ".mp3";QTextCodec *code = QTextCodec::codecForName("GB2312");std::string name = code->fromUnicode(this->musicPath).data();qDebug() << this->musicPath;FILE *file = fopen(name.c_str(), "wb+");if (file == NULL){qDebug() << "打开文件失败";return;}this->file = file;this->ui->listWidget->clear();this->ui->listWidget->addItem(this->ui->searchEdit->text());this-> j = 1;}else if (this->row == 0){QMessageBox::information(this, "提示框", "抱歉用户,该歌曲不存在");this->ui->searchEdit->clear();this->ui->listWidget->clear();//断掉连接 为了下次连接正确NetWork *w = NetWork::getNet();disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(readData()));this->j = 0;}}else if (this->j == 1) //获取文件大小{qDebug() << "文件大小";QByteArray recv = w->socket->readAll();// 大小QString str = QString(recv);//得到了音乐文件的大小this->size = str.split("#").at(1).toInt();qDebug() << this->size;this->j = 2;}else if (this->j == 2){//读前4字节获取读多少数据QByteArray recv = w->socket->read(4);u_long count = 0;memcpy(&count, recv.data(), 4);count = ntohl(count);this->Icount = count;//读后4字节获取读到的第几个包QByteArray bag = w->socket->read(4);u_long many = 0;memcpy(&many, bag.data(), 4);many = ntohl(many);//读8个字节后的数据QByteArray data = w->socket->read(count);this->music->append(data);this->all = this->all + count;qDebug() << QString::number(this->all) + "/" + QString::number(this->size);fwrite(data.toStdString().c_str(), count, 1, file);}
}void musicwin::setDir()
{QFileInfo info("./day4_musicWork.exe");QString absolutePath = info.absolutePath();//创建临时文件夹this->dirName = absolutePath + "/" + "TemporaryMusic";QDir dir(dirName);if (!dir.exists()){dir.mkdir(dirName);qDebug() << "文件夹创建成功";}
}
//刷新读数据
void musicwin::on_pushButton_clicked()
{while (1){readData();if (this->Icount != 1000){qDebug() << this->musicPath;fclose(file);this->file = NULL;this->j = 0;this->all = 0;//断开信号NetWork *w = NetWork::getNet();QByteArray rec = w->socket->readAll();disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(readData()));break;}}QMessageBox::information(this, "提示框", "歌曲开始播放");//此时歌曲播放//播放音乐this->mediaPlayer->setMedia(QUrl(this->musicPath));//滚动显示歌曲名称QFileInfo fileInfo(this->musicPath);this->musicName = fileInfo.baseName();this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);//播放开始的时候将播放的按钮由播放设置为暂停this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));//设置上下首为不可按状态this->ui->pushButton_last->setEnabled(false);this->ui->pushButton_next->setEnabled(false);return;
}
//重新关闭函数
void musicwin::closeEvent(QCloseEvent *e)
{int ret = QMessageBox::question(this, "提示框", "是否确认退出");if (ret != QMessageBox::Yes){e->ignore();return;}DelDir(this->dirName);exit(0);
}//删除临时文件夹
bool musicwin::DelDir(const QString &path)
{if (path.isEmpty()){return false;}QDir dir(path);if (!dir.exists()){return true;}dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); //设置过滤QFileInfoList fileList = dir.entryInfoList(); // 获取所有的文件信息foreach (QFileInfo file, fileList)  //遍历文件信息{if (file.isFile())  // 是文件,删除{file.dir().remove(file.fileName());}else   // 递归删除{DelDir(file.absoluteFilePath());}}qDebug() << "删除临时文件夹成功";return dir.rmdir(dir.absolutePath()); // 删除文件夹
}//下载文件
void musicwin::on_downloadBtn_clicked()
{NetWork *w = NetWork::getNet();QByteArray rec = w->socket->readAll();//下载前把多媒体关闭this->mediaPlayer->stop();QString filePath;//获取保存到的地址filePath = QFileDialog::getSaveFileName(this, "歌曲下载到", ".", "MP3(*.mp3)");if (filePath.isNull() == true){return;}else{QTextCodec *code = QTextCodec::codecForName("GB2312");std::string name = code->fromUnicode(filePath).data();FILE *saveFile = fopen(name.c_str(), "ab+");if (saveFile != NULL){//UTF-8 GBK类型转换this->musicPath = this->dirName + "/" + this->ui->searchEdit->text() + ".mp3";QTextCodec *code = QTextCodec::codecForName("GB2312");std::string musicName = code->fromUnicode(this->musicPath).data();FILE *musicFile = fopen(musicName.c_str(), "rb");if (musicFile == NULL){qDebug() << "打开文件失败";return;}fseek(musicFile, 0, SEEK_SET);char buf[1000] = {'\0'};while (!feof(musicFile)){memset(buf, '\0', sizeof(buf));fread(buf, 1, sizeof(buf), musicFile);fwrite(buf, 1, sizeof(buf), saveFile);}fclose(musicFile);}fclose(saveFile);}this->ui->searchEdit->clear();this->ui->listWidget->clear();QMessageBox::information(this, "提示框", "开始播放下载好的歌曲");//此时歌曲播放//播放音乐this->mediaPlayer->setMedia(QUrl(filePath));//将第一首歌曲加入播放器中this->mediaPlayer->setMedia(QUrl(this->musicPath));//滚动显示歌曲名称QFileInfo fileInfo(filePath);this->musicName = fileInfo.baseName();//加入列表显示this->ui->listWidget->addItem(this->musicName);//显示正在播放的歌曲this->ui->listWidget->setCurrentRow(0);this->name = this->musicName + "   ";this->ui->label_2->setText(this->name);//开始播放this->mediaPlayer->play();this->timer->start(1000);//播放开始的时候将播放的按钮由播放设置为暂停this->ui->pushButton_play->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}
//将这个歌曲收藏到歌单里
void musicwin::on_collectBtn_clicked()
{//断开连接NetWork *w = NetWork::getNet();//拼接字符串char str[100] = {'\0'};QByteArray musicName = this->ui->searchEdit->text().toUtf8();sprintf(str, "Collect#%s", musicName.data());qDebug() << str;//有写数据的时候,会发射一个readyRead的信号connect(w->socket, SIGNAL(readyRead()), this, SLOT(ensureCollect()));//发送信息w->socket->write(str);
}
//确保是否加入收藏歌单内
void musicwin::ensureCollect()
{NetWork *w = NetWork::getNet();disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(showMyMusic()));QByteArray str = w->socket->read(50);if (QString(str) == "1"){QMessageBox::information(this, "提示框", "收藏歌曲成功");}else{QMessageBox::warning(this, "提示框", "收藏歌曲失败");}//用完之后断开连接disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(ensureCollect()));
}
//显示该用户的歌单
void musicwin::on_showBtn_clicked()
{//显示列表前清空列表框this->ui->listWidget->clear();NetWork *w = NetWork::getNet();//拼接字符串char str[100] = {'\0'};strcpy(str, "Show");qDebug() << str;//有写数据的时候,会发射一个readyRead的信号connect(w->socket, SIGNAL(readyRead()), this, SLOT(showMyMusic()));//发送信息w->socket->write(str);
}
//从服务器接收自己的歌单显示在列表框内
void musicwin::showMyMusic()
{NetWork *w = NetWork::getNet();if (this->times == 0) // 判断第一次歌单是否存在{QByteArray str = w->socket->read(50);this->exist = QString(str).toInt();this->times = 1;}else if (this->exist == 0 && this->times == 1) // 第二次如果有数据接收数据{QByteArray recv = w->socket->readAll();QString str = QString(recv);//得到了发送来的歌单的数量int number = str.split("#").at(1).toInt();//第三个开始为歌曲名字 i从2开始 所以循环歌曲数量number+2次for (int i = 2; i <= (number + 2); i++){this->ui->listWidget->addItem(str.split("#").at(i));}this->times = 0;disconnect(w->socket, SIGNAL(readyRead()), this, SLOT(showMyMusic()));}else if (this->exist == 1){QMessageBox::warning(this, "提示框", "您尚未收藏任何歌曲");}
}

Qt网编实现音乐播放器的使用(Linux搭建服务器)相关推荐

  1. Vue2仿网易云风格音乐播放器(附源码)

    Vue2仿网易云风格音乐播放器 1.整体效果 2.使用技术 3.实现内容 4.源码 5.使用图片 1.整体效果 2.使用技术 使用了HTML5 + CSS3进行页面布局及美化 使用Vue2进行数据渲染 ...

  2. YOLOv5 Qt 手势车载中控音乐播放器

    资源: 配置工程:Python&Qt--yolov5手势识别隔空操纵车载音乐播放器(点击查看) 工程资源:YOLOv5 & Qt 手势车载中控音乐播放器v2(点此下载) 老工程资源:Y ...

  3. QT纯代码打造音乐播放器

    QT纯代码打造音乐播放器 在.pro文件中添加 QT = prmultimedia 然后就是在.h文件中添加相关库函数 我添加的库函数 有些是不需要的,可以自定义删除修改 我是为方便以后扩展功能就留下 ...

  4. 【QT】实现本地音乐播放器

    [说明]最近在写一个音乐播放器,大概花了两天时间完成了基本功能,包括本地音乐的打开.播放.收藏等.后续想完善音乐列表(借助sqlite数据库).网络音乐(借助网易云API接口)功能,先上初步UI效果图 ...

  5. 基于Qt Phonon模块实现音乐播放器

    这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐 ...

  6. 给自己的博客园添加网抑云音乐播放器

    1. 申请权限 首先给自己的博客园设置,申请js权限,这个教程可以去搜. 2. 打开网页版网抑云音乐 点击一首你喜欢的歌进入 , 然后点击生成外链播放器 然后复制代码: 进入到自己的博客园设置页面 我 ...

  7. 基于QT c++开发的音乐播放器

    目录 一.简介 1.简介 2.界面部分截图 3.功能描述 二.代码 1.工程目录 2.代码展示 3.工程地址 一.简介 1.简介 这是本人大二学期专业课程设计所设计的一个很简易的音乐播放器(功能有限, ...

  8. 音乐管理软件 linux,音乐播放器 Rhythmbox For Linux

    Rhythmbox是Linux下的音乐播放和管理软件,为Fedora和Ubuntu等Linux发行版默认安装的音乐播放器.它可以播放各种音频格式的音乐,管理收藏的音乐. 功能特色 音乐回放 支持回放来 ...

  9. 嵌入式 QT 基于mplayer的音乐播放器

    1.实现功能 2.音乐播放界面 2.1 界面程序 2.1.1 界面控制初始化 2.1.2 控件风格程序 3. 歌曲列表界面 3.1.1 在 widget.h 定义 QListWidge 对象指针 3. ...

最新文章

  1. 未能使用“Csc”任务的输入参数初始化该任务
  2. java 头尾 队列_探索JAVA并发 - 并发容器全家福
  3. Mysql-高可用集群[MyCat中间件使用](三)
  4. Vue 导入文件import、路径@和.的区别
  5. 日语学习-多邻国-平假名4
  6. java resouce_Java 获取Resource目录下的文件解决办法
  7. WinForm开发之点滴整理
  8. IEEE access参考文献的添加
  9. 关于ADS注册表删除和重新安装
  10. 面对裁员潮,程序员如何安身立命
  11. 数字图像处理学习总结(1):灰度变换与空间滤波
  12. STM32使用HSE/HSI配置时钟(六)
  13. C++ 标准库の使用迷思
  14. ADXL345实现功能全面的计步器
  15. 初学Java多线程:线程简介
  16. IIS或Apache部署Django项目时,Admin后台管理CSS样式丢失?
  17. 应付帐款—制单处理,出现“供应商被锁定”的解决方法
  18. 物联网与射频识别技术,课程实验(一)
  19. 局域网安全防护技术(内网)
  20. 私有ip地址是怎么分配的?

热门文章

  1. UR机械臂仿真和用上位机编程控制
  2. 望京,承包了帝都码农圈的魔幻
  3. 计算机计算公式单组数据求乘法,(excel表格全部数据怎么乘以一个数啊)
  4. 王峰 阜阳师范学院计算机,《阜阳师范学院学报》投稿_学报投稿网
  5. mysql的三种engine_MySQL 学习之-三种安装方式与版本介绍
  6. 嵌入式开发——结构体指针作为参数传递变量的值不正确
  7. 《商业模式》读书笔记
  8. UOS20编译Qt程序:搭环境、解决bug
  9. 数据中心中交换机的转发原理 ---尚文网络奎哥
  10. Ubuntu20.04 安装 Ipopt + cppAD流程,一键到底没有废话(复制流攻略)