117_qt制作mplayer音乐播放器,BUG总结

1、线程中获取歌词时间

117_qt制作mplayer音乐播放器,BUG总结_第1张图片

//--------------------------------发送线程命令-发送到命名管道-----------------------------------------------------//
void *send_cb(void *arg)
{    
    widget.pause_flag = 1;//程序运行,进入线程,播放状态,就进行时间获取打印

//    char *send_cmd[2] = {"get_time_length\n","get_time_pos\n"};
//    int i = 0;
//    while(1)//不停的向有名管道文件发送命令
//    {
//        sleep(1);
//        for(i = 0; i < 2; i++)//2 条指令
//        {

//            if(widget.pause_flag == 1)//加上播放状态在发送获取时间指令,否则会冲开线程,导致播放、暂停按键失灵
//            {
//                pthread_mutex_lock(&widget.mutex);
//                write(widget.fd_cmd, send_cmd[i], strlen(send_cmd[i]));
//                pthread_mutex_unlock(&widget.mutex);
//                usleep(500000);//for循环的时间非常快,加个延时,稍微延缓一下指针数组内两个字符串指令的写操作
//            }

//        }
//    }
    while(1)
    {
        if( widget.pause_flag == 1)
        {
            pthread_mutex_lock(&widget.mutex);//上锁,保险起见
            write(widget.fd_cmd, "get_time_length\n", strlen("get_time_length\n"));
            pthread_mutex_unlock(&widget.mutex);//解锁
        }
        usleep(200*1000);                                                   //延时200ms

        if( widget.pause_flag == 1)
        {
            pthread_mutex_lock(&widget.mutex);//上锁,保险起见
            write(widget.fd_cmd, "get_time_pos\n", strlen("get_time_pos\n"));
            pthread_mutex_unlock(&widget.mutex);//解锁
        }
        usleep(200*1000);                                                   //延时200ms

    }
}

2、发送歌词时间的线程,线程最后添加延时必须

//----------------------------------------------发送歌曲时间的线程----------------------------------------------//
void *recv_cb(void *arg)
{

    Widget *p = (Widget*)arg;

    char buf[128] = "";
    while(1)
    {
        memset(buf, 0, sizeof(buf));//重置一下数据缓冲器
        read(widget.fd[0], buf, sizeof(buf));
        if(buf == NULL)
        {
            qDebug() << "================buf  null===================";
        }
        else
        {
            if(strstr(buf, "ANS_LENGTH"))
            {
                sscanf(buf, "%*[^=]=%d", &widget.len_t);
                char s[26] = "";
                sprintf(s, "%02d : %02d", widget.len_t/60, widget.len_t%60);

                //把线程信息,发送到进程中
                //发送歌曲总时间
               if(widget.pos_t != widget.len_t)
               {
                   emit p->send_time_len(s);
               }


            }
            //memset(s, 0, sizeof(s));

            if(strstr(buf, "ANS_TIME_POSITION"))
            {
                sscanf(buf, "%*[^=]=%d", &widget.pos_t);

                char ss[26] = "";
                sprintf(ss, "%02d : %02d", widget.pos_t/60, widget.pos_t%60);



                //把线程信息,发送到进程中
                //发送当前歌曲时间
                if(widget.pos_t  !=  widget.len_t)
                {
                    p->ui->ProgressBar->setValue( (widget.pos_t*1.0/widget.len_t) *100);
                    emit p->send_time_pos(ss);

                    if(widget.len_t  - widget.pos_t == 3)
                    {
                        /*****单曲结束自动下一首******/
                        emit p->Next_song_signal();
                    }
                }
            }

            //memset(ss, 0, sizeof(ss));
        }

    }
    sleep(1);
}

3、副控件list表格【显示歌词】的控件中,返回点击歌词的行号或者文本

/*这里可以做到点击list表格中的某一行,返回该行文本信息,但是放在
不断刷新行文本的情况下(不断地添加歌词进来,行不断的自动增加),会有时导致添加进来的
行及其文本阻塞住,歌词显示停在那里,等待几秒才会刷新*/
    int i;
    QList<QListWidgetItem *>items = ui->listWidget->selectedItems();
    if(!items.empty())
   {
        qDebug()<<"选中了某行";

        int count = items.count();
        for(i = 0; i < count; i++)
        {
            int row = ui->listWidget->row(items.at(i));
            QListWidgetItem *item_text = items.at(i);
            QString text = item_text->text();//获取内容
            qDebug() << "list列表每行内容 :"<< text;
        }
    }

4、打印歌词的线程中(显示到label标签控件中和listwidget控件中),切歌了怎么办,歌曲信息必须更改

歌词需要while循环,一直不停的去拿取歌词信息才行
在所有切歌的功能,的槽函数中都加上widget.flag=1;的标志位
117_qt制作mplayer音乐播放器,BUG总结_第2张图片

5、切换音量的时候,如何避免冲开暂停、播放的进程(加标志位,加锁

加锁:阻塞住其他的操作
117_qt制作mplayer音乐播放器,BUG总结_第3张图片

6、listwiaget表格接收去其他界面传递的字符串信息,显示在表格中,如何遍历表格内容,不相同再插入

117_qt制作mplayer音乐播放器,BUG总结_第4张图片

7、两种将listwidget表格中的Qstring文本,转成成char *str形式的方法【Qstring->char *】

只有QListWidgetItem自己能改变自己的状态(如checked,selected,颜色等)状态,QListWidget是无法改变其项的状态的。
列表控件是被动接受子项的状态改变,然后根据状态改变调用它的信号函数。
该控件只能控制当前行,并不能控制行的状态(如checked,selected),行的状态是由QListWidgetItem来决定的。

.

QListWidget槽函数

setCurrentRow(index)用来表示你开始要选中哪一行
currentRow()表示当前位于哪一行

.

QListWidget信号:

itemPressed()表示当某行被按下后发出该信号
itemClicked()表示当某行被点击后发出该信号

.

点击某行ListWidget文本,发送char*地址的具体转换操作:

//itemClicked:信号
connect(m_listwidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(ListRowNum())); //槽函数不能有参数

void VideoDialog::ListRowNum()
{
    QString str = m_listwidget->item(0)->text();
    qDebug() << "list item::" << m_listwidget->currentItem()->text(); //鼠标选中某行的内容
    qDebug() << m_listwidget->currentRow(); //鼠标选中某一行
}

	//1、
	QString str = "My name is Li Hua 哈哈";
	//这个转换再想利用QString的构造函数则不行了,还需要借助QByteArray类来进行转换:
	//由于使用了toLatin1转换的不支持中文,包含的中文会乱码,所以我使用了toUtf8
	//但是我上网搜了一下,好像没有人会这样转Char *,是不是有什么风险?这个本人就不得而知,测试结果是真香可观
    QByteArray MyByteArray = str.toUtf8();
	
    char *myChar = MyByteArray.data();
    qDebug() << myChar;

	//下面这个写法是错误的,不能串行写。
	//myChar = str.toUtf8().data();
    //qDebug() << myChar



	//2、
	//或者可以这样,但是这样的话data()返回值是const char *类型
    QString s2 = "Hello World 2!";
    QByteArray ba2;
    ba2.append(s2);     //也可以 ba2 = s2.toLatin1();
    const char *c2 = ba2.data();
    qDebug() << s2 << c2;
	//需要const_cast转换一下
	char * myCharStr = const_cast<char *>(myChar);



链接:

多种Qt的数据类型转换

117_qt制作mplayer音乐播放器,BUG总结_第5张图片

8、发送歌词的线程中,采用for循环,向容器中插入歌词以及每句时间

117_qt制作mplayer音乐播放器,BUG总结_第6张图片

你可能感兴趣的:(QT,物联网,qt)