当调用 QAbstractAnimation::start() 时,QPropertyAnimation 不会立即 运行
QPropertyAnimation not running immediately when QAbstractAnimation::start() is called
我正在尝试使用 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);
}
有什么方法可以延迟页面更改,直到我的动画完成?当我注释掉页面更改时,动画似乎甚至没有开始,直到 QApplication::exec()
在我的 main
方法中被调用,从 8 秒的等待时间(两个睡眠调用的组合)可以看出,而不是在调用 QAbstractAnimation::start()
之前延迟 5 秒。
我相信发生的事情是 sleep(3)
行停止了 GUI 运行 打开的线程,因此将动画的开始延迟了三秒钟。当睡眠调用完成后,我想知道动画是否试图继续,但是由于页面变化,快速转换没有明显的效果。
如何在不停止动画 运行 关闭的线程的情况下延迟 3 秒?或者有没有其他的建议会产生同样的效果?
I believe what is happening is that the sleep(3) line is stopping the thread in which the GUI is running on
几乎可以肯定。对于 运行 的动画,您需要保留消息队列 运行ning,在您发布的代码中,直到随后调用 a.exec()
.[=16 才会发生=]
如果您真的需要在动画完成之前阻止 MainWindow::AnimateStartScreen
的执行,那么也许更好的主意是将对 sleep(3)
的调用替换为...
while (progressBarAnimation->state() != QAbstractAnimation::Stopped)
QCoreApplication::processEvents();
(尽管您可能需要尝试传递给 QCoreApplication::processEvents
的标志以获得您需要的精确行为。)
使用下一个模式进行非阻塞等待(而不是睡眠):
QEventLoop loop;
connect( progressBarAnimation, &QAbstractAnimaion::finished, &loop, &QEventLoop::quit );
loop.exec();
我正在尝试使用 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);
}
有什么方法可以延迟页面更改,直到我的动画完成?当我注释掉页面更改时,动画似乎甚至没有开始,直到 QApplication::exec()
在我的 main
方法中被调用,从 8 秒的等待时间(两个睡眠调用的组合)可以看出,而不是在调用 QAbstractAnimation::start()
之前延迟 5 秒。
我相信发生的事情是 sleep(3)
行停止了 GUI 运行 打开的线程,因此将动画的开始延迟了三秒钟。当睡眠调用完成后,我想知道动画是否试图继续,但是由于页面变化,快速转换没有明显的效果。
如何在不停止动画 运行 关闭的线程的情况下延迟 3 秒?或者有没有其他的建议会产生同样的效果?
I believe what is happening is that the sleep(3) line is stopping the thread in which the GUI is running on
几乎可以肯定。对于 运行 的动画,您需要保留消息队列 运行ning,在您发布的代码中,直到随后调用 a.exec()
.[=16 才会发生=]
如果您真的需要在动画完成之前阻止 MainWindow::AnimateStartScreen
的执行,那么也许更好的主意是将对 sleep(3)
的调用替换为...
while (progressBarAnimation->state() != QAbstractAnimation::Stopped)
QCoreApplication::processEvents();
(尽管您可能需要尝试传递给 QCoreApplication::processEvents
的标志以获得您需要的精确行为。)
使用下一个模式进行非阻塞等待(而不是睡眠):
QEventLoop loop;
connect( progressBarAnimation, &QAbstractAnimaion::finished, &loop, &QEventLoop::quit );
loop.exec();