c++ - 管理gui的状态

标签 c++ events state

我正在开发一个图形程序,可以让您连接或托管服务器。它有一个输入IP的字段。现在有 2 种状态:HostingConnecting。托管 IP 字段时应禁用。为此,我会将以下内容添加到 HostConnectChanged 事件中:

if(state == Hosting)
{
    ipField.enable(false);
}
else if(state == Connecting)
{
    ipField.enable(true);
}

在我看来,这是一种以简单方式处理 gui 状态的合理方式。问题是向程序添加另一种类型的状态。它可以连接/托管或断开连接。连接后,IP 字段也应被禁用。

if(state == Hosting)
{
    ipField.enable(false);
}
else if(state == Connecting)
{
    if(state2 == Idle)
        ipField.enable(true);
}
if(state2 == Running)
{
    ipField.enable(false);
}
else if(state2 == Idle)
{
    if(state == Connecting)
        ipField.enable(true);
}

我想您明白这是怎么回事了。更大的程序如何处理多个状态?这不应该是具有简单解决方案的 gui 编程中的一个众所周知的问题吗?

最佳答案

较大的程序总是大量使用 separation of concerns ,并尽可能将状态保持在相关对象的本地。 state design pattern 是处理此类状态相关行为的一种非常常见的方法。 .

如果你的两个州是独立的:

理想情况下,几个不同的对象类将各自使用自己的状态机。例如,表单上的某些控件可能取决于连接状态。其他一些控件可能取决于表单中的修改状态。组件的全局状态(例如表单)然后简单地从其部分状态的组合中出现(例如连接/修改,或连接/未更改)。

如果您的状态是依赖的:

然而,在您的情况下,这两个状态是相关的,因为 RunningConnecting 似乎不兼容。最简单的方法当然是使用复合状态机,其中有效状态是所有允许的组合。然后将状态模式与复合状态一起使用。

关于c++ - 管理gui的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49435603/

相关文章:

javascript - 使用 promise 的一次性事件处理?

ms-access - MS Access 中表单/报告事件的顺序是什么?

javascript - this.setState({array}) 中发生了什么?

haskell - 这两个非常相似的 haskell 状态计算有什么区别

c++ - 如何在MIPS汇编程序中使用库?

javascript - event.keycode 在 Firefox 中未返回正确的值

c++ - 在没有基类(非派生)的类中为虚函数添加 final 关键字是否有意义

ios - -[CBPeripheral isConnected] : unrecognized selector sent to instance

c++ - glGetObjectLabel 的段错误

c++ - 使用Gmock调用成员函数