Qt中QPropertyAnimation的问题

时间:2010-05-17 16:43:49

标签: qt animation

我在Qt中遇到QPropertyAnimation问题

我的代码:

QString my_text = "Hello Animation";
        ui->textBrowser->setText((quote_text));
        ui->textBrowser->show();
        QPropertyAnimation animation2(ui->textBrowser,"geometry");
        animation2.setDuration(1000);
        animation2.setStartValue(QRect(10,220/4,1,1));
        animation2.setEndValue(QRect(10,220,201,71));
        animation2.setEasingCurve(QEasingCurve::OutBounce);
        animation2.start();
直到现在它似乎非常好,但问题是,只有当我在它后面显示一个消息框时我才能看到这个动画。

        QMessageBox m;
        m.setGeometry(QRect(100,180,100,50));
        m.setText("close quote");
        m.show();
        m.exec();

当我删除此消息框的代码时,我再也看不到动画了。 该程序的功能根本不需要显示此MessageBox。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

也许这是一个更新问题。你能尝试将QPropertyAnimation的valueChanged()信号连接到GUI中的update()调用吗?

答案 1 :(得分:0)

我的猜测是,您呈现的动画代码位于较大的代码块中,其中控件不会返回到事件循环(或者事件循环尚未启动)。这意味着当调用MessageBox的exec函数时,事件循环再次开始运行,并且动画开始。如果您要在动画中间关闭消息框,那么它也可能会冻结。

答案 2 :(得分:0)

animation2被声明为局部变量。当封闭功能 退出,它不再在作用域中并被删除。动画永远不会像 当Qt返回事件循环时,它不存在,并且如QAbstractAnimation中所述 documentationQPropertyAnimation继承了QAbstractAnimation),要执行QPropertyAnmiation,它必须在Qt返回事件循环时存在。

  

当控件到达事件循环时,动画将自行运行,   随着动画的进行,定期调用updateCurrentTime()。

解决方案是动态分配animation2而不是将其声明为 本地变量。

QPropertyAnimation *animation2 = new QPropertyAnimation(ui->textBrowser,"geometry");
animation2->setDuration(1000);
animation2->setStartValue(QRect(10,220/4,1,1));
animation2->setEndValue(QRect(10,220,201,71));
animation2->setEasingCurve(QEasingCurve::OutBounce);
animation2->start();

请注意,该技术与C ++中使用的技术相同 QPropertyAnmiation中提供的示例 documentation

QPropertyAnimation *animation = new QPropertyAnimation(myWidget, "geometry");
animation->setDuration(10000);
animation->setStartValue(QRect(0, 0, 100, 30));
animation->setEndValue(QRect(250, 250, 100, 30));

animation->start();

原始问题注释:

  

只有当我在动画后面显示一个消息框时,我才能看到此动画

这是QMessageBox的工作方式的一个有趣的副作用。 exec() 方法执行事件循环。由于事件循环在范围内执行 包含animation2animation2的函数中, 执行所需的动画。

默认情况下,当父项animation2位于 原始问题已删除。如果您希望动画是 完成执行后被删除,ui->textBrowser提供了一个属性 控制何时删除动画。自动删除 QAbstractAnimation完成执行后,将animation2方法更改为:

start()