//--------------------------------发送线程命令-发送到命名管道-----------------------------------------------------//
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
}
}
//----------------------------------------------发送歌曲时间的线程----------------------------------------------//
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);
}
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;
}
}
歌词需要while循环,一直不停的去拿取歌词信息才行
在所有切歌的功能,的槽函数中都加上widget.flag=1
;的标志位
加锁
)Qstring
文本,转成成char *str
形式的方法【Qstring->char *】只有QListWidgetItem
自己能改变自己的状态(如checked,selected,颜色等)状态,QListWidget
是无法改变其项的状态的。
列表控件是被动接受
子项的状态改变,然后根据状态
改变调用它的信号函数。
该控件只能控制当前行,并不能控制行的状态(如checked,selected),行的状态是由QListWidgetItem来决定的。
.
setCurrentRow(index)用来表示你开始要选中哪一行
currentRow()表示当前位于哪一行
.
itemPressed()表示当某行被按下后发出该信号
itemClicked()表示当某行被点击后发出该信号
.
//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的数据类型转换