c++ - 将 QObject 用作​​类成员并将该成员用作连接的上下文是否安全?

标签 c++ qt c++11 qt5

我有一个“普通”(非 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/

相关文章:

c++ - Qt paintevent() 未触发

对 Range-v3 压缩容器进行排序 - 我可以解压吗?

c++ - 重载解析在 gcc 和 clang 之间得到不同的结果

c++ - 打包 LEFT 和 RIGHT channel 数据

c++ - 类/全局函数声明 C++

c++ - 一旦它已经在一个项目上工作,如何在 Visual Studio 中的另一个项目上使用 Qt

c++ - 如何在可变参数模板类中获取函数指针的参数类型?

c++ - 使用 sdl_mixer 生成音调在 ubuntu 12.04 64 位中因段错误而退出

c++ - 指针类型转换改变了意外的内存

javascript - 如何在 QML 中的 50 个文本字段之间切换焦点?