c++ - 保持 GUI 独立

标签 c++ user-interface signals-slots

我有一个程序(除其他外)有一个命令行界面,让用户输入字符串,然后通过网络发送。问题是我不确定如何将在 GUI 内部生成的事件连接到网络接口(interface)。假设我的 GUI 类层次结构如下所示:

GUI -> MainWindow -> CommandLineInterface -> EntryField

每个 GUI 对象都包含一些其他 GUI 对象,并且所有内容都是私有(private)的。现在 entryField 对象生成一个事件/信号,表示已输入消息。目前我正在将信号向上传递到类层次结构中,因此 CLI 类看起来像这样:

public:
    sig::csignal<void, string> msgEntered;

在 c'tor 中:

entryField.msgEntered.connect(sigc::mem_fun(this, &CLI::passUp));

passUp 函数只是再次发出信号以供所属类 (MainWindow) 连接,直到我最终可以在主循环中执行此操作:

gui.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));

现在这似乎是一个非常糟糕的解决方案。每次我向 GUI 添加内容时,我都必须通过类层次结构将其连接起来。我确实看到了几种解决方法。我可以将所有对象公开,这样我就可以在主循环中执行此操作:

gui.mainWindow.cli.entryField.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));

但这与封装的想法背道而驰。我还可以在整个 GUI 中传递对网络接口(interface)的引用,但我希望 GUI 代码尽可能独立。

感觉好像我在这里缺少一些重要的东西。有没有一种干净的方法可以做到这一点?

注意:我正在使用 GTK+/gtkmm/LibSigC++,但我没有这样标记它,因为我在 Qt 中遇到了几乎相同的问题。这确实是一个普遍的问题。

最佳答案

根本问题是您将 GUI 视为一个整体应用程序,只有 gui 通过比平常更大的电线连接到其余逻辑。

您需要重新考虑 GUI 与后端服务器交互的方式。通常,这意味着您的 GUI 成为一个独立的应用程序,几乎什么都不做,并且在 GUI 内部(即您的信号和事件)与服务器的处理逻辑之间没有任何直接耦合的情况下与服务器对话。即,当您单击一个按钮时,您可能希望它执行某些操作,在这种情况下您需要调用服务器,但几乎所有其他事件只需要更改 GUI 内的状态而不对服务器执行任何操作 - 直到你准备好了,或者用户想要一些响应,或者你有足够的空闲时间在后台进行调用。

诀窍是为服务器定义一个完全独立于 GUI 的界面。您应该能够在以后更改 GUI 而无需修改服务器。

这意味着您将无法自动发送事件,您需要手动连接它们。

关于c++ - 保持 GUI 独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506441/

相关文章:

c++ - 加密编译可执行文件中的常量字符串(例如密码)

java - 图像未显示在 JPanel 上

java - 在 JSpinner 中禁用数字分组

c++ - 是否可以在没有接收器实例的情况下将信号连接到静态插槽?

c++ - 等待按钮按下(QT)

c++ - 我可以使用 tie 将一对元素放入 vector 中吗?

c++ - 初始化指针或引用成员变量以指向另一个成员

python - 什么是 python 字典和 zip 的最佳 C++ 替代品?

python - 在 OS-X 中使用鼠标启动 Python 脚本的简便方法

c++ - 在 Qt 中使用 C++ 运算符作为插槽