使用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秒后启动,因为每个连续计时器都是在前一个计时器启动后设置的。除非任务的其他部分需要线程,否则我认为没有必要使用它们。创建一个单发计时器。之后,更改按钮的颜色,然后创建另一个单发计时器。重复一遍。