我在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。 有人可以帮忙吗?
答案 0 :(得分:0)
也许这是一个更新问题。你能尝试将QPropertyAnimation的valueChanged()信号连接到GUI中的update()调用吗?
答案 1 :(得分:0)
我的猜测是,您呈现的动画代码位于较大的代码块中,其中控件不会返回到事件循环(或者事件循环尚未启动)。这意味着当调用MessageBox的exec函数时,事件循环再次开始运行,并且动画开始。如果您要在动画中间关闭消息框,那么它也可能会冻结。
答案 2 :(得分:0)
animation2
被声明为局部变量。当封闭功能
退出,它不再在作用域中并被删除。动画永远不会像
当Qt返回事件循环时,它不存在,并且如QAbstractAnimation
中所述
documentation
(QPropertyAnimation
继承了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()
方法执行事件循环。由于事件循环在范围内执行
包含animation2
,animation2
的函数中,
执行所需的动画。
默认情况下,当父项animation2
位于
原始问题已删除。如果您希望动画是
完成执行后被删除,ui->textBrowser
提供了一个属性
控制何时删除动画。自动删除
QAbstractAnimation
完成执行后,将animation2
方法更改为:
start()