c++ - 如何将 Q_GLOBAL_STATIC 与插件一起使用?
问题描述
如何将 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 并将生成的目标文件链接到应用程序和插件。但是如何只编译目标文件呢?
也许我必须将模板(在 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;
}
希望这不会导致其他问题
推荐阅读
- ocaml - 有没有一种简单的方法可以将元组列表转换为具有单个元素的列表,反之亦然?
- r - 是否有 R 代码仅删除带有连续空白的行
- python - 拖动时按钮强制鼠标进入窗口的左上角
- python - 如何让辅助脚本中的函数不需要带参数?
- javascript - NodeJS - 记录到 Windows 事件日志?
- c# - 如何在 C# 中修复“Clone.Bitmap”系统内存不足
- ios - 向下转换/子类 UIViewController 用于单元测试中的模拟
- docker - 如何在 Golang 应用程序中建立与 Kerberos 的连接?
- excel - 在表中的特定列上使用替代()来更改日期
- python - WindowsError: [错误 3] 系统找不到指定的路径: