使用 c++ qt 控制动画之间的时间间隔的方法
Ways to control time interval between animation with c++ qt
在作业中,我们应该使用 c++ 和 qt 来显示按钮的一系列颜色变化,每种颜色持续可变的时间,具体取决于某些输入。教授建议使用QTimer单次拍摄来完成此操作,该算法在一定时间后调用某个插槽。
我试图通过循环浏览动画列表并创建一系列单镜头来做到这一点,每次通过颜色变化的长度增加等待时间。但是,动画持续的实际时间长度与指定的时间有很大差异。
我的怀疑是创建单次触发的循环和线程触发的性质弄乱了单次计时器。有没有办法在不陷入多线程混乱的情况下以可靠的时间制作动画?
如果没有,我将如何以多线程方式执行此操作,而不必围绕线程完全重构代码?谢谢!
但是,动画持续的实际时间长度与指定的时间有很大差异。
在没有看到你的代码的情况下,我假设你已经设置了一个时间数组,你对它们何时触发的期望是错误的,因为它是时间的积累,而不是时间本身。如果您下次从连接到超时的插槽内部调用,则会发生这种情况。
这里有一个MCVE来演示:
class MyClass : public QObject
{
public:
MyClass();
void Start()
{
UpdateButton(0);
}
void UpdateButton(int delayIdx);
void TimedOut(int delay)
{
qDebug("Timed Out %d", delay);
}
private:
QList<int> m_delayList;
};
MyClass::MyClass()
: QObject(NULL)
{
m_delayList.push_back(3000); // 3 seconds
m_delayList.push_back(3000);
m_delayList.push_back(5000);
}
void MyClass::UpdateButton(int delayIdx)
{
if(delayIdx == m_delayList.count())
return;
QTimer* pTimer = new QTimer(this);
pTimer->setSingleShot(true);
int delay = m_delayList[delayIdx++];
connect(pTimer, &QTimer::timeout, [=](){
TimedOut(delay);
UpdateButton(delayIdx); // use of recursion
pTimer->deleteLater();
});
pTimer->start(delay);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyClass cls;
cls.Start();
return a.exec();
}
因此,在此示例中,类具有延迟列表。看起来前两个会同时触发(3000 毫秒后),但是当我们运行时,第一个会在 3 秒后触发,第二个会在 6 秒后触发,第三个会在 11 秒后触发,因为每个连续计时器都是在前一个触发后设置的。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 将时间戳打印到流的最简单方法
- 通常使用什么方法来检测时间情况?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 有没有更准确的方法来记录C++时间?
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 更好的单元测试方法,花费的时间太长
- 替换枚举以最大化编译时间检查的最佳方法
- 如何在长时间运行的方法中等待信号?
- 使用 GetLastError() 的真正正确的方法(时间)是什么?
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- C 类方法的执行时间取决于什么
- 扩展中的日期时间对象方法C++问题
- 一定时间后强制终止方法
- 此插入方法的时间和空间复杂性
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- 查找系统调用需要多长时间的可能方法
- 在 C++11 中表示日内时间 HH:MM:SS 的最佳方法是什么?
- C 编译时间检查模板类型中是否存在方法