【问题标题】:Qt - How to syncronously request data from QObjectQt - 如何从 QObject 同步请求数据
【发布时间】:2019-06-20 15:39:34
【问题描述】:

我的部分代码是两个 C++ 类“ClassA”和“ClassB”,它们都继承自 QObject。

在它的某些方法中,ClassB 需要同步请求存储在 ClassA 中的数据。

ClassA

是否有类似于信号/插槽的 Qt API 可以用于它?

我能想到两种可能的选择,但我不确定 如果它们在架构上是正确的:

1) 在 ClassA 中定义 Q_INVOKABLE 函数,该函数将返回所需的数据作为其返回值,并在 ClassB 中调用它。

但我不确定 Q_INVOKABLE 是否可以用于 C++/QML 绑定以外的其他用途,以及在其他情况下如何正确注册它。

2) 分别在 ClassB/ClassA 中创建常规信号/槽对。

在 ClassB 中发出的信号将用于从 ClassA 请求数据,并将有一个指针作为其输入 arg,该指针将指向存储数据的位置。 ClassA 中的 slot 会将数据写入此指针。

void ClassA::slot(type *ptr)
{
// write data to ptr
}

void ClassB::signal(type *ptr)

【问题讨论】:

  • 为什么不直接给A类加个方法直接调用呢?
  • 目前这两个对象之间的通信是通过信号/槽。所以我认为我的情况可能有类似的情况。

标签: c++ qt qt5


【解决方案1】:

听起来你想要依赖注入。这是一个花哨的词,可以简单地将 A 类引用到 B 类,可能作为构造函数参数。

如果您在编写源代码时可以确定它是ClassA,请使用QPointer<ClassA>。然后根据需要调用 ClassA 的任何方法。

如果你不能锁定确切的类,只知道它将是QObject,然后使用QPointer<QObject>并使用Qt属性或可调用方法(Q_INVOKABLE或只是一个带有返回值的槽)来请求什么你想要的。

作为替代方案,如果 ClassB 实例可以拥有 ClassA 的实例,只需将指向 ClassA 实例的指针赋予 B,然后让 B 将自己设置为 A 的父级。然后它会被析构函数自动删除(通常的 Qt 方式的 QObject 所有权)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2011-09-24
    • 1970-01-01
    • 2014-03-12
    • 2015-02-28
    相关资源
    最近更新 更多