diff --git a/src/plugins/designer/CMakeLists.txt b/src/plugins/designer/CMakeLists.txt index 18b1cf97692..eea16798a5d 100644 --- a/src/plugins/designer/CMakeLists.txt +++ b/src/plugins/designer/CMakeLists.txt @@ -1,3 +1,22 @@ +# used in the .json.in +if(Qt6_VERSION VERSION_GREATER_EQUAL 6.7.0) + set(DESIGNER_PLUGIN_ARGUMENTS + "\"Arguments\" : [ + { + \"Name\" : \"-designer-qt-pluginpath\", + \"Parameter\" : \"path\", + \"Description\" : \"Override the default search path for Qt Designer plugins\" + }, + { + \"Name\" : \"-designer-pluginpath\", + \"Parameter\" : \"path\", + \"Description\" : \"Add a custom search path for Qt Designer plugins\" + } + ],") +else() + set(DESIGNER_PLUGIN_ARGUMENTS) +endif() + add_qtc_plugin(Designer PLUGIN_CLASS FormEditorPlugin CONDITION TARGET Qt::DesignerComponentsPrivate AND TARGET Qt::Designer diff --git a/src/plugins/designer/Designer.json.in b/src/plugins/designer/Designer.json.in index b11764606e4..2d03527c30a 100644 --- a/src/plugins/designer/Designer.json.in +++ b/src/plugins/designer/Designer.json.in @@ -15,5 +15,6 @@ "Category" : "Qt Creator", "Description" : "Qt Designer integration.", "Url" : "http://www.qt.io", + ${DESIGNER_PLUGIN_ARGUMENTS} ${IDE_PLUGIN_DEPENDENCIES} } diff --git a/src/plugins/designer/formeditor.cpp b/src/plugins/designer/formeditor.cpp index 86f5f13c8df..4d8acb41f5b 100644 --- a/src/plugins/designer/formeditor.cpp +++ b/src/plugins/designer/formeditor.cpp @@ -78,6 +78,9 @@ static inline QIcon designerIcon(const QString &iconName) return icon; } +Q_GLOBAL_STATIC(QString, sQtPluginPath); +Q_GLOBAL_STATIC(QStringList, sAdditionalPluginPaths); + using namespace Core; using namespace Designer::Constants; using namespace Utils; @@ -203,9 +206,24 @@ public: static FormEditorData *d = nullptr; -FormEditorData::FormEditorData() : - m_formeditor(QDesignerComponents::createFormEditor(nullptr)) +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) +static QStringList designerPluginPaths() { + const QStringList qtPluginPath = sQtPluginPath->isEmpty() + ? QDesignerComponents::defaultPluginPaths() + : QStringList(*sQtPluginPath); + return qtPluginPath + *sAdditionalPluginPaths; +} +#endif + +FormEditorData::FormEditorData() +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + m_formeditor = QDesignerComponents::createFormEditorWithPluginPaths(designerPluginPaths(), + nullptr); +#else + m_formeditor = QDesignerComponents::createFormEditor(nullptr); +#endif if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO; QTC_ASSERT(!d, return); @@ -871,5 +889,17 @@ void FormEditorData::print() printer->setPageOrientation(oldOrientation); } +void setQtPluginPath(const QString &qtPluginPath) +{ + QTC_CHECK(!d); + *sQtPluginPath = qtPluginPath; +} + +void addPluginPath(const QString &pluginPath) +{ + QTC_CHECK(!d); + sAdditionalPluginPaths->append(pluginPath); +} + } // namespace Internal } // namespace Designer diff --git a/src/plugins/designer/formeditor.h b/src/plugins/designer/formeditor.h index 0d069e2322c..875c8e50904 100644 --- a/src/plugins/designer/formeditor.h +++ b/src/plugins/designer/formeditor.h @@ -60,5 +60,8 @@ SharedTools::WidgetHost *activeWidgetHost(); FormWindowEditor *activeEditor(); QList optionsPages(); +void setQtPluginPath(const QString &qtPluginPath); +void addPluginPath(const QString &pluginPath); + } // namespace Internal } // namespace Designer diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index fd9a78187c5..37d0f7ce5df 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -60,7 +60,25 @@ FormEditorPlugin::~FormEditorPlugin() delete d; } -void FormEditorPlugin::initialize() +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) +static void parseArguments(const QStringList &arguments) +{ + const auto doWithNext = [arguments](auto it, const std::function &fun) { + ++it; + if (it != arguments.cend()) + fun(*it); + }; + for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { + if (*it == "-designer-qt-pluginpath") + doWithNext(it, [](const QString &path) { setQtPluginPath(path); }); + else if (*it == "-designer-pluginpath") + doWithNext(it, [](const QString &path) { addPluginPath(path); }); + } +} +#endif + +bool FormEditorPlugin::initialize([[maybe_unused]] const QStringList &arguments, + [[maybe_unused]] QString *errorString) { d = new FormEditorPluginPrivate; @@ -91,6 +109,11 @@ void FormEditorPlugin::initialize() if (qtr->load(trFile, qtTrPath) || qtr->load(trFile, creatorTrPath)) QCoreApplication::installTranslator(qtr); } + +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + parseArguments(arguments); +#endif + return true; } void FormEditorPlugin::extensionsInitialized() diff --git a/src/plugins/designer/formeditorplugin.h b/src/plugins/designer/formeditorplugin.h index e24c76ec538..754aeecaee4 100644 --- a/src/plugins/designer/formeditorplugin.h +++ b/src/plugins/designer/formeditorplugin.h @@ -24,7 +24,7 @@ private slots: #endif private: - void initialize() override; + bool initialize(const QStringList &arguments, QString *errorString) override; void extensionsInitialized() override; void switchSourceForm();