我在我的 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 项目提供额外的变量,然后我必须正确初始化,等等。
我更喜欢更优雅的东西。