#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); initMainWindow(); // 初始化主界面 mplayerInit(); // 初始化 mplayer scanSong(); // 扫描歌曲列表 setSongList(); // 将扫描的歌曲显示到歌曲列表中 // 捕获当前时间信号 connect(this, SIGNAL(currentTimeSignal(int)), this, SLOT(setCurrentTimeLabel(int))); // 建立滑块修改信号通讯 connect(this, SIGNAL(currentProgressSignal(int)), this, SLOT(setCurrentSlider(int))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initMainWindow() { // 设置主窗体属性 setWindowTitle("音乐播放器"); // 设置子组件背景透明 ui->song_list_widget->setAttribute(Qt::WA_TranslucentBackground); ui->label_artist->setAttribute(Qt::WA_TranslucentBackground); ui->label_song_list->setAttribute(Qt::WA_TranslucentBackground); ui->label_song_name->setAttribute(Qt::WA_TranslucentBackground); ui->label_meta_album->setAttribute(Qt::WA_TranslucentBackground); ui->contrl_widget->setAttribute(Qt::WA_TranslucentBackground); ui->widget_show->setAttribute(Qt::WA_TranslucentBackground); ui->volume_widget->setAttribute(Qt::WA_TranslucentBackground); ui->widget_3->setAttribute(Qt::WA_TranslucentBackground); ui->time_left_label->setAttribute(Qt::WA_TranslucentBackground); ui->time_right_label->setAttribute(Qt::WA_TranslucentBackground); ui->time_widget->setAttribute(Qt::WA_TranslucentBackground); // 设置滑块属性 ui->time_slider->setStyleSheet("QSlider::groove:horizontal { background-color: white; }" "QSlider::handle:horizontal { background-color: blue; width: 20px;}"); ui->volume_slider->setStyleSheet("QSlider::groove:horizontal { background-color: gray; }" "QSlider::handle:horizontal { background-color: yellow; width: 20px;}"); ui->volume_slider->setMinimum(0); // 最小音量 0 ui->volume_slider->setMaximum(100); // 最大音量 100 // 当前音量从 mplayer 属性获取 // QSlider* slider = new QSlider(Qt::Horizontal); // slider->setMinimum(0); // 设置最小值 // slider->setMaximum(100); // 设置最大值 // slider->setValue(50); // 设置当前值 // slider->setSingleStep(1); // 设置步长 } void MainWindow::mplayerInit() { // 创建一个无名管道 pipe(fd); // 创建有名管道 mkfifo("fifo_cmd", 0666); // 创建 子进程启动 mplayer pid_t pid = fork(); if(pid == 0) // 子进程 { // 重定向标准输出 dup2(fd[1], 1); // 使用 exec 启动 mplayer // execlp("mplayer","mplayer","-idle","-slave","-quiet","/home/flykhan/qtmplayer/song/StopLove.mp3",NULL); execlp("/usr/bin/mplayer","mplayer","-idle","-slave","-quiet","-input","file=fifo_cmd","/home/flykhan/qtmplayer/song/StopLove.mp3",NULL); _exit(-1); // 异常退出 } else if(pid>0) // 父进程 { // 打开管道 // 以写的方式打开(阻塞到某进程 以读的方式打开) fifo_fd = open("fifo_cmd", O_WRONLY); if(fifo_fd < 0){ perror("open"); // return 0; _exit(0); // 管道打开失败直接返回 } } } void MainWindow::scanSong() { // 1. 得到目录句柄 DIR *dir = opendir("/home/flykhan/qtmplayer/song"); if(NULL == dir) { perror("opendir"); _exit(0); // 目录为空返回 } // 2. 根据目录句柄扫描当前文件 while(1) { // 读取文件目录 struct dirent *dirent = readdir(dir); if(NULL==dirent) break; // 判断类型为 DT_REG->文件类型 if(dirent->d_type == DT_REG) { // 如果扫描到的文件名包含 ".mp3",则将该文件名添加到向量数组中 if(strstr(dirent->d_name, ".mp3") != NULL) { vectorSong.push_back(string(dirent->d_name)); } } } // 关闭目录句柄 closedir(dir); } void MainWindow::playNextSong(void) { index++; if(index == vectorSong.size()) index = 0; // 当索引到达歌曲最后一个时,将索引置为 0 ,循环索引 char changeSongBuf[128] = ""; // 将 loadfile 'song_name_path' 写入字符数组 int len = sprintf(changeSongBuf, "loadfile ./song/%s\n", vectorSong[index].c_str()); qDebug() << changeSongBuf << endl; // 控制台打印下一首歌的名字 // write(this->fifo_fd, changeSongBuf.toUtf8().toStdString().c_str(),changeSongBuf.toUtf8().toStdString().size()); write(this->fifo_fd, changeSongBuf, len); // 将获取的下一首歌曲名写入到有名管道中 } void MainWindow::setCurrentTimeLabel(int time) { int m = 0, s = 0; m = time / 60; // 算分钟 s = time % 60; // 算秒钟 char buf[32] = ""; sprintf(buf,"%02d:%02d",m,s); // 将歌曲当前时间设置到 label ui->time_left_label->setText(QString(buf)); } void MainWindow::setCurrentSlider(int currentProgress) { // 设置时间滑动条状态 ui->time_slider->setValue(currentProgress); } void MainWindow::on_play_btn_clicked() { if(play_btn_flag == 0) { ui->play_btn->setIcon(QIcon(":/icon/button")); play_btn_flag = 1; } else if (play_btn_flag == 1) { ui->play_btn->setIcon(QIcon(":/icon/button_play")); play_btn_flag = 0; } } void MainWindow::setSongList() { QStringList strList; for(vector::const_iterator it = vectorSong.begin(); it != vectorSong.end(); ++it) { strList.append(QString::fromStdString(*it)); } ui->song_list_widget->addItems(strList); }