使用c++;qt 在赋值中,我们应该使用C++和Qt来显示一系列按钮颜色变化,每个颜色根据一定的输入持续可变的时间。教授建议使用QTimer singleshot来实现这一点,即在一定时间后调用某个时隙

使用c++;qt 在赋值中,我们应该使用C++和Qt来显示一系列按钮颜色变化,每个颜色根据一定的输入持续可变的时间。教授建议使用QTimer singleshot来实现这一点,即在一定时间后调用某个时隙,c++,qt,animation,delay,qtimer,C++,Qt,Animation,Delay,Qtimer,我试图通过在动画列表中循环并创建一系列单镜头来实现这一点,每次都通过颜色变化的长度来增加等待时间。但是,动画最后一次的实际时间长度与指定的时间相差很大 我的怀疑是,创建单次触发的循环和线程触发的性质打乱了单次触发计时器。有没有一种方法可以在不陷入多线程混乱的情况下,以可靠的时间制作动画 如果没有,我将如何以多线程的方式进行,而不必围绕线程完全重构代码?谢谢 但是,动画最后一次的实际时间长度与指定的时间相差很大 在没有看到代码的情况下,我假设您设置了一个时间数组,并且您对它们何时触发的预期是错误的

我试图通过在动画列表中循环并创建一系列单镜头来实现这一点,每次都通过颜色变化的长度来增加等待时间。但是,动画最后一次的实际时间长度与指定的时间相差很大

我的怀疑是,创建单次触发的循环和线程触发的性质打乱了单次触发计时器。有没有一种方法可以在不陷入多线程混乱的情况下,以可靠的时间制作动画

如果没有,我将如何以多线程的方式进行,而不必围绕线程完全重构代码?谢谢

但是,动画最后一次的实际时间长度与指定的时间相差很大

在没有看到代码的情况下,我假设您设置了一个时间数组,并且您对它们何时触发的预期是错误的,因为这是时间的累积,而不是时间本身。如果您下次从连接到超时的插槽内呼叫,则会发生这种情况

下面是一个示例:

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();
}
class MyClass:公共QObject
{    
公众:
MyClass();
void Start()
{
更新按钮(0);
}
无效更新按钮(int delayIdx);
无效时间延迟(整数延迟)
{
qDebug(“超时%d”,延迟);
}
私人:
QList m_延迟列表;
};
MyClass::MyClass()
:QObject(空)
{
m_delayList.向后推(3000);//3秒
m_delayList.向后推_(3000);
m_delayList.向后推_(5000);
}
void MyClass::UpdateButton(int delayIdx)
{
if(delayIdx==m_delayList.count())
返回;
QTimer*pTimer=新的QTimer(此);
pTimer->setSingleShot(真);
int delay=m_delayList[delayIdx++];
连接(pTimer,&QTimer::timeout,[=](){
延时;
UpdateButton(delayIdx);//递归的使用
pTimer->deleteLater();
});
pTimer->启动(延迟);
}
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
MyClass cls;
cls.Start();
返回a.exec();
}

因此,在本例中,类有一个延迟列表。前两个可能会同时启动(3000ms后),但当我们运行时,第一个会在3秒后启动,第二个会在6秒后启动,第三个会在11秒后启动,因为每个连续计时器都是在前一个计时器启动后设置的。

除非任务的其他部分需要线程,否则我认为没有必要使用它们。创建一个单发计时器。之后,更改按钮的颜色,然后创建另一个单发计时器。重复一遍。