【发布时间】:2023-04-10 15:24:01
【问题描述】:
我正在尝试使用Qt 4.8.6 在Qt Creator 中使用QStackedWidgets 制作一个简单的多页小部件。目标是在进度条达到完整值后使QLabel 和QProgressBar 消失。我认为实现这一目标的最佳方法是串联使用QGraphicsOpacityEffect 和QPropertyAnimation,如下所示。
void MainWindow::AnimateStartScreen()
{
//QSound::play("./Audio/THX-DeepNote-48Khz.wav");
sleep(5);
logoEffect = new QGraphicsOpacityEffect();
logoAnimation = new QPropertyAnimation(logoEffect, "opacity");
ui->startLogo->setGraphicsEffect(logoEffect);
logoAnimation->setDuration(2000);
logoAnimation->setStartValue(1);
logoAnimation->setEndValue(0);
logoAnimation->start();
progressBarEffect = new QGraphicsOpacityEffect();
progressBarAnimation = new QPropertyAnimation(progressBarEffect, "opacity");
ui->startProgressBar->setGraphicsEffect(progressBarEffect);
progressBarAnimation->setDuration(2000);
progressBarAnimation->setStartValue(1);
progressBarAnimation->setEndValue(0);
progressBarAnimation->start();
sleep(3);
}
然后由main 方法调用:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.HideTitleBar();
w.CenterWidget();
//QMainWindow::showFullScreen();
w.show();
w.IncrementProgressbar();
w.AnimateStartScreen();
w.ChangePageTo(1);
return a.exec();
}
这就是问题所在。我希望这个动画在我改变页面之前完成:
void MainWindow::ChangePageTo(int page)
{
ui->stackedWidget->setCurrentIndex(page);
}
有什么方法可以延迟页面更改,直到我的动画完成?当我注释掉页面更改时,动画似乎直到在我的 main 方法中调用 QApplication::exec() 才开始,这可以通过 8 秒的等待时间(两个睡眠调用的组合)来证明,而不是 5调用QAbstractAnimation::start() 之前的第二次延迟。
我相信正在发生的事情是 sleep(3) 行正在停止运行 GUI 的线程,因此将动画的开始延迟了三秒钟。当 sleep 调用完成后,我想知道动画是否会尝试继续,但是由于页面更改,快速转换没有可见的效果。
如何在不停止动画运行的线程的情况下延迟 3 秒?或者有没有其他可以产生相同效果的建议?
【问题讨论】: