Qt c++ 比很多信号槽更好的方法

Posted

技术标签:

【中文标题】Qt c++ 比很多信号槽更好的方法【英文标题】:Qt c++ Better way than lots of signal-slots 【发布时间】:2016-11-22 08:11:05 【问题描述】:

我有一个关于 Signal-Slots 的问题:

假设我有 2 个类 CL_A、CL_B

class CL_A : public QObject

  Q_OBJECT
private:
  int a,b,c;                  // in reality I have more than 3 variables 
                              // that need to be set
public:
  void set_a ( int par_a);
  void set_b ( int par_b);    // in reality I have more than 3 setters
  void set_c ( int par_c);    // I also have getters and other methods     
  ...
;

CL_B * cl_b = new CL_B();

从 CL_B 我想使用 CL_A 的设置器来设置 CL_A 类的变量 a、b、c。为了做到这一点,我为每个设置器设置了信号槽连接。现在我的问题是:

有没有更好的方法来做到这一点,而不是使用大量的信号槽连接(每种方法一个)?

【问题讨论】:

您可以将指向A 的指针传递给B 并直接调用东西。无论如何,乍一看,内部对象必须在外部对象中设置某些东西的情况似乎是一个糟糕的设计。 您是否希望通过相同类型的信号槽设置CL_A 成员变量(如示例中所示)? 这取决于很多上下文。如果您同时设置它们,那么您可以只传递一个结构而不是单独传递每个值。但是您应该编辑问题并详细说明您实际尝试做的事情。 但是您应该编辑问题并提供一些您实际尝试做的细节。我支持这个建议。如果没有更多细节和对确切问题的更多了解,很难提供帮助。 要问的一个问题是,如果 B 知道 A(您在问题文本中暗示)为什么需要使用信号和插槽,而不是直接调用?有很多可能的充分理由,但要回答这个问题,我们/您需要知道原因。 【参考方案1】:

我假设这些类实际上是 QObject 的后代,或者你根本不能使用信号槽。 “更好”的方式取决于实际想要做什么。那应该是线程安全的,而其他对象是全局的还是被其他线程使用的?它应该是异步的吗?如果答案是肯定的,您需要信号或其他同步方法,对您正在使用的库有效。

QSignalMapper (How works QSignalMapper?) 可能允许创建一些通用的单个处理程序来处理多个事件,但是如果您的字段不是元组或数组,您将如何概括这些事件?

您可以使用其他 C++ 模式。如果代码对时间不敏感,而是要创建易于支持的代码,您可以考虑创建将字段名称映射到其地址的类,因此您可以执行类似

的操作

cl_b[“速度”] = 值;

我建议尝试查看 Stephen C. Dewhurst "C++ Gotchas"

【讨论】:

以上是关于Qt c++ 比很多信号槽更好的方法的主要内容,如果未能解决你的问题,请参考以下文章

Qt c++ 信号槽不能正常工作

Qt C++ 信号和槽没有触发

Qt c++和Qml信号槽连接

C++框架编程Qt 的 信号与槽 简单了解!

Qt for python 的信号槽机制使用

Qt编程中信号与槽机制可以用啥方法替换