【问题标题】:Signal sharing architecture in QtQt 中的信号共享架构
【发布时间】:2014-03-18 22:52:40
【问题描述】:

使用 MVC,我有几个视图类,所有这些都需要写入事件日志。事件日志包含一个名为 addEntry 的插槽,它将数据写入日志。我正在为如何实现信号而苦苦挣扎。我不想将事件日志对象传递给每个类。我也是……

1) 在每个类中创建本地信号,并让我的主窗口将它们全部连接起来? 2)我可以将插槽设为静态,以便所有视图都可以访问它而不需要事件日志对象吗? 3)创建一个信号并将其作为函数指针传递给每个类,以便它们都可以使用相同的信号? 4) 别的?

谢谢。

【问题讨论】:

  • 我不确定你所说的#2 是什么意思。您可以将信号或属性放在基类中,所有派生类都将拥有它。 “静态”信号不起作用。它需要有一个实例化的对象来接收信号。
  • 目前我的观点并不都来自同一个基类,但也许我应该考虑一下。

标签: c++ qt signals-slots


【解决方案1】:
  1. 最多见下文。
  2. 没有。插槽have to be associated with class instances
  3. 我怀疑 moc 会理解这一点,而且似乎 不必要的复杂。
  4. 原则上你可以让事件 向上传播父/子层次结构并让主窗口编辑 日志,但这也太复杂了。

假设您的视图类从 QAbstractItemView 继承,那么它们已经有您可以使用的信号,特别是如果您使用 Q*Widget 便利类。在你的情况下,如果这对我不起作用,我会做 1)。您还可以考虑从模型类发出信号——毕竟这是更新实际发生的地方。

【讨论】:

  • 那么我会坚持使用#1。谢谢。
【解决方案2】:

你不能在你的事件日志类中设置静态成员函数来检索一个指向 事件记录实例?如果这就是你所拥有的,则返回一个全局实例,

静态EventLogger* EventLogger::getLoggerInstance();

如果您有多个事件记录器,则更为细微。

静态EventLogger* EventLogger::getLoggerInstance(args, ...);

如果视图需要挂钩事件记录,它会检索一个事件记录实例并连接到它。

【讨论】:

  • 我试图避免强迫所有视图都知道事件记录器。最终我将为该软件编写插件,并且我希望这些类能够发送信号而不必担心插槽。
  • 啊,如果这很重要,那么您可以做一些事情来使日志记录设置更加通用(例如,将事件源实现作为 mixin 多重继承类),但基本上我会留下来使用 #1 并忽略此答案。
猜你喜欢
  • 2016-10-07
  • 2011-01-09
  • 2015-10-11
  • 1970-01-01
  • 2010-11-27
  • 2016-07-29
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多