无法使horizo​​ntalSlider以固定的时间间隔滑动

时间:2016-09-27 16:16:44

标签: qt

我需要使用Qt创建一个音乐播放器,其中滑块会随着歌曲的进展而滑动。

this->ui->horizontalSlider->setValue(10);
sleep(1);
this->ui->horizontalSlider->setValue(20);

我正在尝试上面的内容,但不能使它显示更改的值,因为程序暂停1秒钟,只显示第二个值(20)。

我怎样才能实现这个目标?

2 个答案:

答案 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);