0

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

我更喜欢更优雅的东西。

4

0 回答 0