c++ - 如何将 Q_GLOBAL_STATIC 与插件一起使用?

标签 c++ qt singleton qt5 qmake

如何在插件中使用 Q_GLOBAL_STATIC? 我想全面使用“全局”QMap,这样我就不必在不同的地方保存 QMap 并每次都同步它。 正如我所读到的,Q_GLOBAL_STATIC 应该可以完成这项工作。

我的 Qt 项目具有以下结构:

.
+-- common
|   +-- common.pro
|   +-- singleton.h
|   +-- singleton.cpp [contains Q_GLOBAL_STATIC and returns it via instance() static method]
+-- plugins
|   +-- p1
|   |   +-- p1.pro
|   |   +-- ...
|   +-- p2
|   |   +-- p2.pro
|   |   +-- ...
|   +-- plugins.pro [TEMPLATE = subdirs]
+-- app
|   +-- app.pro
|   +-- app.cpp
|   +-- ...
+-- project.pro [TEMPLATE = subdirs]

main函数(在app.cpp中)是第一个调用单例的地方。 因此它是在插件加载之前创建并已知的。

目前我正在考虑编译 singleton.o 并将生成的目标文件链接到应用程序和插件。 但是如何只编译目标文件呢?

也许我必须将 TEMPLATE(在 common.pro 中)指定为 lib? 如果是这样,它应该是共享库还是静态库? 共享库没有代码拷贝,所以也许这对单例来说是必需的,对吧?

我的想法是否正确,我是否可以只通过使用 Q_GLOBAL_STATIC 而在不显式共享指针的情况下拥有一个整体的单例?

最佳答案

现在它可以使用 qApp 对实例方法进行一些修改。

/* [singleton.h] */
class Singleton : public QObject {
    /* ... */
};
Q_DECLARE_OPAQUE_POINTER(Singleton *)
Q_DECLARE_METATYPE(Singleton *)

/* [singleton.cpp] */
Singleton * Singleton::instance() {
    static Singleton * __ptr(NULL);
    if (!qApp->property("singletonkey").isValid() && !__ptr) {
        __ptr = ptr_from_macro; // Q_GLOBAL_STATIC pointer
        qApp->setProperty("singletonkey", QVariant::fromValue(__ptr));
    } else if (!__ptr) {
        __ptr = qvariant_cast<Singleton *>(qApp->property("singletonkey"));
    } else if (!qApp->property("singletonkey").isValid()) {
        qApp->setProperty("singletonkey", QVariant::fromValue(__ptr));
    }
    return __ptr;
}

希望这不会导致其他问题🙈

关于c++ - 如何将 Q_GLOBAL_STATIC 与插件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457208/

相关文章:

c++ - 单击某个项目时禁用自动滚动

c++ - 单例继承 C++ 实现

ruby - 给定一个 Ruby 对象的实例,我如何获得它的元类?

c++ - 从静态构造函数代码调用时 pthread 库失败

c++ - 即使注册成功,CreateWindowEx 也会失败并出现错误 1407?

c++ - C++ 11 中带有选项 R 的正则表达式

multithreading - 在 Scala 上创建线程本地对象

c++ - Qt 图表 - 如何在 x 和 y 轴上显示特定点值?

c++ - 如何在删除另一个堆对象时删除堆上的对象

c++ - Qt iOS 如何从可执行文件中排除资源以满足应用商店限制