方案1:尝试使用Qt的信号槽机制:当控件数据变化时发出信号,与该信号连接的槽函数将Process的状态重置!有点绕~
方案2:在Process内部保留一个数据拷贝,当最新数据和拷贝数据不一致时,将Process的状态重置,该Process所有后继结点更新。
void setData(const flowType& v){ *d_ptr = v; }
改成
void setData(const flowType& v)
{
if (*d_ptr != v)
{
reset();
}
*d_ptr = v;
}
Provider派生类的d_ptr为数据缓存,存储控件的数据。当数据变化时即*d_ptr != v时,将该结点的launched标志量置为false,迫使该结点的所有后继结点更新。对于int, string等上述setData满足,但是float和double需要特化:
void setData(const float& v)
{
if ( abs(*d_ptr - v)>1.0 )
reset();
*d_ptr = v;
}
这个看似不起眼的细节修改,优雅地解决了静态场景中,数据局部更新的问题。