我在GUI中使用复选框来切换控制通过信号/插槽连接的机器的类中的位。
我还需要相反的方向,因为如果机器的某些命令切换相同的位,我的GUI应该反映出这些变化。
我的问题是: 单击该复选框时,发送信号时其状态尚未更新。 因此第一个信号到达机器,位被切换,机器响应第二个信号并到达GUI处理程序方法'updateCheckBoxXYZ'。 现在我想知道是否需要更新复选框。
如果整个链由用户启动,则复选框将最后自动更新。 如果内部命令直接切换该位,则需要选中该复选框以反映内部更改。
由于尚未检查复选框,我不能要求'isChecked()'。
我怎么办才能不陷入无尽的循环?
更新 我刚试过类似下面的代码:
// slot called by toggled(bool)
void DialogXY::checkBoxXYChanged(bool bState)
{
if (bState != m_bGuiStateXY)
{
m_bGuiStateXY = bState;
emit GuiXYChanged(bState);
// optional: .. do some GUI related things ..
}
}
// slot called on signal 'GuiXYChanged(bState)'
void Machine::changeXY(int iModul, bool bState)
{
if (bState != m_bMachineStateXY)
{
emit MachineXYChanged(bState);
}
// .. change machine configuration ..
}
// slot called on signal 'MachineXYChanged(bState)'
void DialogXY::updateCheckBoxXY(bool bState)
{
if (bState != m_bStateXY)
{
ui.checkBoxXY->setChecked(bState);
// will signal toggled()
}
}
但我需要为每个GUI项添加额外的变量, 我必须正确初始化等等。
我更喜欢更优雅的东西。