首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当调用Qacuact动画::start()时,QPropertyAnimation没有立即运行

当调用Qacuact动画::start()时,QPropertyAnimation没有立即运行
EN

Stack Overflow用户
提问于 2016-07-09 18:13:43
回答 2查看 630关注 0票数 0

我试图用Qt中的QStackedWidgetsQt 4.8.6制作一个简单的多页面小部件。目标是在进度条达到全部值后使QLabelQProgressBar逐渐消失。我认为实现这一目标的最佳方法是同时使用QGraphicsOpacityEffectQPropertyAnimation,如下所示。

代码语言:javascript
复制
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方法调用:

代码语言:javascript
复制
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();
}

问题就在这里。我希望在更改页面之前完成此动画,如下所示:

代码语言:javascript
复制
void MainWindow::ChangePageTo(int page)
{
    ui->stackedWidget->setCurrentIndex(page);
}

有没有一种方法可以推迟页面更改,直到我的动画完成?当我注释掉页面更改时,动画似乎直到QApplication::exec()在我的main方法中被调用时才开始,这从8秒的等待期(两个睡眠调用的组合)而不是QAbstractAnimation::start()被调用之前的5秒延迟就可以明显看出。

我相信正在发生的事情是,sleep(3)行正在停止运行GUI的线程,因此将动画的启动延迟了3秒。当休眠调用完成后,我想知道动画是否会继续,但是由于页面的改变,快速转换没有明显的效果。

如何在不停止动画正在运行的线程的情况下延迟3秒?或者还有什么其他的建议会产生同样的效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-09 18:41:20

我相信正在发生的事情是睡眠(3)行正在停止运行GUI的线程

几乎可以肯定。要运行动画,您需要保持消息队列运行,在您发布的代码中,消息队列在随后调用a.exec()之前不会发生。

如果你真的需要阻止MainWindow::AnimateStartScreen的执行直到动画完成,那么一个更好的方法也许是用.

代码语言:javascript
复制
while (progressBarAnimation->state() != QAbstractAnimation::Stopped)
  QCoreApplication::processEvents();

(尽管您可能不得不使用传递给QCoreApplication::processEvents的标志来获得所需的精确行为。)

票数 1
EN

Stack Overflow用户

发布于 2016-07-09 18:54:58

使用next模式进行非阻塞等待(而不是睡眠):

代码语言:javascript
复制
QEventLoop loop;
connect( progressBarAnimation, &QAbstractAnimaion::finished, &loop, &QEventLoop::quit );
loop.exec();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38284845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档