我有一个程序(除其他外)有一个命令行界面,允许用户输入字符串,然后将通过网络发送。问题是我不确定如何将在 GUI 深处生成的事件连接到网络接口。例如,假设我的 GUI 类层次结构如下所示:
GUI -> MainWindow -> CommandLineInterface -> EntryField
每个 GUI 对象都包含其他一些 GUI 对象,并且一切都是私有的。现在 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 中传递对网络接口的引用,但我希望 GUI 代码尽可能独立。
感觉就像我在这里遗漏了一些重要的东西。有没有一种干净的方法可以做到这一点?
注意:我正在使用 GTK+/gtkmm/LibSigC++,但我没有这样标记它,因为我在 Qt 上遇到了几乎相同的问题。这真的是一个普遍的问题。