我需要使用Qt创建一个音乐播放器,其中滑块会随着歌曲的进展而滑动。
this->ui->horizontalSlider->setValue(10);
sleep(1);
this->ui->horizontalSlider->setValue(20);
我正在尝试上面的内容,但不能使它显示更改的值,因为程序暂停1秒钟,只显示第二个值(20)。
我怎样才能实现这个目标?
答案 0 :(得分:2)
无论您用于音频播放的库,都应异步通知您播放文件的进度。您应该对此类进度做出反应并更新滑块。即使我们忘记了阻止事件循环的事实,使用硬编码延迟也会使滑块与真实音频播放快速失调。
在任何现代应用程序开发框架中,通常都不需要阻止线程进入休眠状态。如果你编写这样的代码,那么在99.99%的情况下它是错误的方法。
答案 1 :(得分:1)
睡觉会阻止程序1秒钟。意味着任何事情发生(音乐播放或在您的应用程序内运行的任何进程)基本上不起作用。
将会发生的是程序将值设置为10,休眠一秒钟(不会发生任何事情),设置为20,然后再次阻止程序1秒钟。所以基本上,你的程序会一直阻塞,并且每秒都设置滑块的值。
解决方案是获取进度值,例如:
int total_time, current_time; //Durations in seconds
int progress; //Will hold the progress percentage
//Somehow you get the total song time and the current song timer
//...
progress = (current_time/total_time)*100
this->ui->horizontalSlider->setValue(progress);
或者:
/*When initializing the slider*/
int total_time; //Duration in seconds
//Somehow you get the the total song time...
//...
this->ui->horizontalSlider->setRange(0,total_time);
在你的日常工作中
/* In the routine where you refresh the slider */
int current_time; //Duration in seconds
//Somehow you get the the current song timer...
//...
this->ui->horizontalSlider->setValue(current_time);