GUI でチェックボックスを使用して、シグナル/スロットで接続されたマシンを制御するクラスのビットを切り替えます。
マシンへのコマンドが同じビットをトグルする場合、GUI に変更が反映されるはずなので、反対方向も必要です。
私の問題は次のとおりです。チェックボックスをクリックすると、信号が送信されたときにその状態がまだ更新されていません。したがって、最初のシグナルがマシンに到着すると、ビットがトグルされ、マシンは 2 番目のシグナルで応答し、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 項目ごとに追加の変数が必要で、初期化してから正しく行う必要があります。
私はもっとエレガントなものを好むでしょう。