我有一个“普通”(非 qt 派生)类。它正在获取传递给它的 QObject 引用。在此类中,我想将输入的 QObject 信号与 lambda 连接起来。 到目前为止,一切正常,除非我的类的对象在传入 QObject 之前被销毁。来自 QObject 的信号现在指向一个不再存在的 lambda。
通常的做法是我的类继承自 QObject,并将 this
作为上下文传递给 connect
。当我的对象死亡时,连接将被 Qt 代码自动销毁。
解决这个问题的另一种方法是保存连接的返回结果,一个 QMetaObject::Connection
然后在我的类调用的析构函数中 QObject::disconnect(resultOfConnect)
.
现在我想如何解决它是这样的:
class SomeQtDerivedClass : public QObject {...}
class MyClass
{
public:
MyClass(SomeQtDerivedClass& qtObject)
{
connect(&qtObject, &qtObject::someSignal, &m_QtObject, [](){blahblah})
}
private:
QObject m_QtObject;
}
我还没有看到这种模式在任何地方使用过,而且我在官方文档中也找不到任何关于这种方法的内容。如果我可以改用组合,我不想从 QObject 继承。如果可以在堆栈上创建 m_QtObject,我不想在堆上创建它。如果我的类对象在输入的 QObject 之前被销毁,我希望连接被自动销毁。
这行得通吗?
最佳答案
它应该可以正常工作(当然只要你不在 m_QtObject
上设置父对象); m_QtObject
被你的类销毁(在用户提供的析构函数之后,如果有的话),所以它与你从 QObject
派生的几乎没有什么不同(实际上是许多的基类观点真的很像一个隐藏的头等舱成员)。
也就是说,我会使用 QMetaObject::Connection
(可能将其包装到 std::unique_ptr
或其他东西中以在销毁时自动断开连接); QObject
非常重量级,仅使用它来利用其自动断开功能似乎有些浪费。
关于c++ - 将 QObject 用作类成员并将该成员用作连接的上下文是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998371/