diff --git a/include/dfm-gui/windowmanager.h b/include/dfm-gui/windowmanager.h index 3e0fb4baca..bc23b59564 100644 --- a/include/dfm-gui/windowmanager.h +++ b/include/dfm-gui/windowmanager.h @@ -28,6 +28,7 @@ class WindowManager : public QObject using Handle = QPointer; static WindowManager *instance(); + void initialize(); QSharedPointer engine() const; Handle createWindow(const QUrl &url, const QString &pluginName, diff --git a/src/apps/dde-file-manager/main.cpp b/src/apps/dde-file-manager/main.cpp index e0b7a4d5bf..a557122af6 100644 --- a/src/apps/dde-file-manager/main.cpp +++ b/src/apps/dde-file-manager/main.cpp @@ -138,6 +138,7 @@ static bool initQmlEngine() globalEngine->addImportPath(DFM_QML_MODULE); #endif + dfmgui::WindowManager::instance()->initialize(); return true; } diff --git a/src/dfm-gui/windowmanager.cpp b/src/dfm-gui/windowmanager.cpp index bd3a67fb23..de7bba7a27 100644 --- a/src/dfm-gui/windowmanager.cpp +++ b/src/dfm-gui/windowmanager.cpp @@ -38,6 +38,29 @@ WindowManagerPrivate::WindowManagerPrivate(WindowManager *q) { } +/*! + * \brief 注册标识为 \a uri 的 QML 模块信息 + * 此函数单独抽离,由于 QtCreator 对 std::call_once 结构下识别不佳,不能有效通过 @uri 识别注册模块。 + */ +void WindowManagerPrivate::registerType(const char *uri) +{ + // 注册,使用 @uri ... 标记,以在 QtCreator 中方便访问 + // @uri org.dfm.base + qmlRegisterModule(uri, 1, 0); + qmlRegisterUncreatableType(uri, 1, 0, "Applet", "Applet attached"); + qmlRegisterExtendedType(uri, 1, 0, "Applet"); + qmlRegisterUncreatableType(uri, 1, 0, "Containment", "Containment attached"); + qmlRegisterExtendedType(uri, 1, 0, "Containment"); + qmlRegisterUncreatableType(uri, 1, 0, "Panel", "Panel attached"); + qmlRegisterExtendedType(uri, 1, 0, "Panel"); + qmlRegisterType(uri, 1, 0, "AppletItem"); + qmlRegisterType(uri, 1, 0, "ContainmentItem"); + + // 工具类,生命周期由 WindowManager 管理 + QuickUtils *globalUtils = new QuickUtils(q_ptr); + qmlRegisterSingletonInstance(uri, 1, 0, "QuickUtils", globalUtils); +} + WindowManager::Handle WindowManagerPrivate::createQuickWindow(const QString &pluginName, const QString &quickId, const QVariantMap &var) { // 首次进入初始化 @@ -252,28 +275,6 @@ void WindowManagerPrivate::aboutToQuit() WindowManager::WindowManager() : dptr(new WindowManagerPrivate(this)) { - // 注册,使用 @uri ... 标记,以在 QtCreator 中方便访问 - // @uri org.dfm.base - const char *uri { "org.dfm.base" }; - qmlRegisterModule(uri, 1, 0); - qmlRegisterUncreatableType(uri, 1, 0, "Applet", "Applet attached"); - qmlRegisterExtendedType(uri, 1, 0, "Applet"); - qmlRegisterUncreatableType(uri, 1, 0, "Containment", "Containment attached"); - qmlRegisterExtendedType(uri, 1, 0, "Containment"); - qmlRegisterUncreatableType(uri, 1, 0, "Panel", "Panel attached"); - qmlRegisterExtendedType(uri, 1, 0, "Panel"); - qmlRegisterType(uri, 1, 0, "AppletItem"); - qmlRegisterType(uri, 1, 0, "ContainmentItem"); - - // 工具类,生命周期由 WindowManager 管理 - QuickUtils *globalUtils = new QuickUtils(this); - qmlRegisterSingletonInstance(uri, 1, 0, "QuickUtils", globalUtils); - - // 退出时清理界面和 QQmlengine - connect(qApp, &QCoreApplication::aboutToQuit, this, [this]() { - Q_D(WindowManager); - d->aboutToQuit(); - }); } WindowManager::~WindowManager() { } @@ -284,6 +285,23 @@ WindowManager *WindowManager::instance() return &manager; } +/*! + * \return 初始化界面管理,仅会执行一次,执行 `org.dfm.base` QML 模块的注册,以及关键信号的关联 + */ +void WindowManager::initialize() +{ + static std::once_flag flag; + std::call_once(flag, [this]() { + d_func()->registerType("org.dfm.base"); + + // 退出时清理界面和 QQmlengine + connect(qApp, &QCoreApplication::aboutToQuit, this, [this]() { + Q_D(WindowManager); + d->aboutToQuit(); + }); + }); +} + /*! * \brief 返回当前界面使用的全局 QQmlEngine , 可用于对 QQmlEngine 进行初始化设置。 * \warning 不要持久化保留此函数返回的指针,当 qApp 抛出 aboutToQuit() 信号时,会释放此 diff --git a/src/dfm-gui/windowmanager_p.h b/src/dfm-gui/windowmanager_p.h index 5c1a048834..3889214b8c 100644 --- a/src/dfm-gui/windowmanager_p.h +++ b/src/dfm-gui/windowmanager_p.h @@ -18,6 +18,8 @@ class WindowManagerPrivate explicit WindowManagerPrivate(WindowManager *q); ~WindowManagerPrivate() = default; + void registerType(const char *uri); + WindowManager::Handle createQuickWindow(const QString &pluginName, const QString &quickId, const QVariantMap &var); void connectWindowHandle(const WindowManager::Handle &handle);