使用 c++ qt 控制动画之间的时间间隔的方法

Ways to control time interval between animation with c++ qt

本文关键字:时间 方法 之间 c++ qt 控制 动画 使用      更新时间:2023-10-16

在作业中,我们应该使用 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 秒后触发,因为每个连续计时器都是在前一个触发后设置的。