Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qmlutils.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "qmlutils.h"
5#include "utils.h"
6
7#include <QtCore/QDir>
8#include <QtCore/QFileInfo>
9#include <QtCore/QCoreApplication>
10#include <QtCore/QJsonDocument>
11#include <QtCore/QJsonObject>
12#include <QtCore/QJsonArray>
13#include <QtCore/QJsonParseError>
14
16
17using namespace Qt::StringLiterals;
18
20{
21 return m1.className.isEmpty() ? m1.name == m2.name : m1.className == m2.className;
22}
23
24// Return install path (cp -r semantics)
26{
27 QString result = root;
28 const qsizetype lastSlashPos = relativePath.lastIndexOf(u'/');
29 if (lastSlashPos != -1) {
30 result += u'/';
31 result += QStringView{relativePath}.left(lastSlashPos);
32 }
33 return result;
34}
35
37{
38 QDir dir(path);
39 if (!dir.entryList(QStringList(QStringLiteral("*.qml")), QDir::Files, QDir::NoSort).isEmpty())
40 return dir.path();
41 const QFileInfoList &subDirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
42 for (const QFileInfo &subDirFi : subDirs) {
43 if (!isBuildDirectory(platform, subDirFi.fileName())) {
44 const QString subPath = qmlDirectoryRecursion(platform, subDirFi.absoluteFilePath());
45 if (!subPath.isEmpty())
46 return subPath;
47 }
48 }
49 return QString();
50}
51
52// Find a directory containing QML files in the project
54{
55 QDir startDirectory(startDirectoryName);
56 if (isBuildDirectory(platform, startDirectory.dirName()))
57 startDirectory.cdUp();
58 return qmlDirectoryRecursion(platform, startDirectory.path());
59}
60
62 DebugMatchMode debugMatchMode, QStringList *matches)
63{
64 const QStringList &dlls = findSharedLibraries(directory, platform, debugMatchMode);
65 for (const QString &dll : dlls)
66 matches->append(directory.filePath(dll));
68 for (const QFileInfo &subDirFi : subDirs) {
69 QDir subDirectory(subDirFi.absoluteFilePath());
70 if (subDirectory.isReadable())
71 findFileRecursion(subDirectory, platform, debugMatchMode, matches);
72 }
73}
74
76 bool usesWidgets, int platform, DebugMatchMode debugMatchMode,
78{
79 Q_UNUSED(usesWidgets);
82 for (const QString &importPath : qmlImportPaths)
83 arguments << QStringLiteral("-importPath") << importPath;
84 arguments << QStringLiteral("-rootPath") << directory;
85 unsigned long exitCode;
86 QByteArray stdOut;
87 QByteArray stdErr;
88 const QString binary = QStringLiteral("qmlimportscanner");
89 if (!runProcess(binary, arguments, QDir::currentPath(), &exitCode, &stdOut, &stdErr, errorMessage))
90 return result;
91 if (exitCode) {
92 *errorMessage = binary + QStringLiteral(" returned ") + QString::number(exitCode)
93 + QStringLiteral(": ") + QString::fromLocal8Bit(stdErr);
94 return result;
95 }
96 QJsonParseError jsonParseError{};
97 const QJsonDocument data = QJsonDocument::fromJson(stdOut, &jsonParseError);
98 if (data.isNull() ) {
99 *errorMessage = binary + QStringLiteral(" returned invalid JSON output: ")
100 + jsonParseError.errorString() + QStringLiteral(" :\"")
101 + QString::fromLocal8Bit(stdOut) + u'"';
102 return result;
103 }
104 const QJsonArray array = data.array();
105 const int childCount = array.count();
106 for (int c = 0; c < childCount; ++c) {
107 const QJsonObject object = array.at(c).toObject();
108 if (object.value(QStringLiteral("type")).toString() == "module"_L1) {
109 const QString path = object.value(QStringLiteral("path")).toString();
110 if (!path.isEmpty()) {
112 module.name = object.value(QStringLiteral("name")).toString();
113 module.className = object.value(QStringLiteral("classname")).toString();
114 module.sourcePath = path;
115 module.relativePath = object.value(QStringLiteral("relativePath")).toString();
116 result.modules.append(module);
117 findFileRecursion(QDir(path), Platform(platform), debugMatchMode, &result.plugins);
118 }
119 }
120 }
121 result.ok = true;
122 return result;
123}
124
126{
127 for (const QmlImportScanResult::Module &module : other.modules) {
128 if (std::find(modules.cbegin(), modules.cend(), module) == modules.cend())
129 modules.append(module);
130 }
131 for (const QString &plugin : other.plugins) {
132 if (!plugins.contains(plugin))
133 plugins.append(plugin);
134 }
135}
136
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qdir.h:19
bool cdUp()
Changes directory by moving one directory up from the QDir's current directory.
Definition qdir.cpp:1042
QString dirName() const
Returns the name of the directory; this is not the same as the path, e.g.
Definition qdir.cpp:715
QString path() const
Returns the path.
Definition qdir.cpp:653
@ NoSort
Definition qdir.h:61
bool isReadable() const
Returns true if the directory is readable and we can open files by name; otherwise returns false.
Definition qdir.cpp:1683
static QString currentPath()
Returns the absolute path of the application's current directory.
Definition qdir.cpp:2051
@ Files
Definition qdir.h:22
@ NoSymLinks
Definition qdir.h:24
@ NoDotAndDotDot
Definition qdir.h:43
@ Dirs
Definition qdir.h:21
\inmodule QtCore \reentrant
Definition qfileinfo.h:22
\inmodule QtCore\reentrant
Definition qjsonarray.h:18
qsizetype count() const
Same as size().
Definition qjsonarray.h:42
\inmodule QtCore\reentrant
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
\inmodule QtCore\reentrant
Definition qjsonobject.h:20
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition qstring.h:279
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5788
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:7822
QString & append(QChar c)
Definition qstring.cpp:3227
QString left(qsizetype n) const
Returns a substring that contains the n leftmost characters of the string.
Definition qstring.cpp:5161
QList< QVariant > arguments
Combined button and popup list for selecting options.
static const QPainterPath::ElementType * subPath(const QPainterPath::ElementType *t, const QPainterPath::ElementType *end, const qreal *points, bool *closed)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
QmlImportScanResult runQmlImportScanner(const QString &directory, const QStringList &qmlImportPaths, bool usesWidgets, int platform, DebugMatchMode debugMatchMode, QString *errorMessage)
Definition qmlutils.cpp:75
QT_BEGIN_NAMESPACE QString findQmlDirectory(Platform platform, const QString &startDirectoryName)
Definition qmlutils.cpp:53
static bool matches(const QJsonObject &object, const QString &osName, const QVersionNumber &kernelVersion, const QString &osRelease, const QOpenGLConfig::Gpu &gpu)
Definition qopengl.cpp:270
GLsizei GLsizei GLenum void * binary
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const GLubyte * c
GLenum array
GLsizei const GLchar *const * path
GLuint64EXT * result
[6]
#define QStringLiteral(str)
static void findFileRecursion(const QDir &directory, Platform platform, DebugMatchMode debugMatchMode, QStringList *matches)
Definition qmlutils.cpp:61
static QString qmlDirectoryRecursion(Platform platform, const QString &path)
Definition qmlutils.cpp:36
bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2)
Definition qmlutils.cpp:19
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:70
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3503
QT_BEGIN_NAMESPACE Platform platform()
Platform
QSharedPointer< T > other(t)
[5]
QString dir
[11]
char * toString(const MyType &t)
[31]
\inmodule QtCore\reentrant
QString installPath(const QString &root) const
Definition qmlutils.cpp:25
QStringList plugins
Definition qmlutils.h:29
QList< Module > modules
Definition qmlutils.h:28
void append(const QmlImportScanResult &other)
Definition qmlutils.cpp:125
QStringList findSharedLibraries(const QDir &directory, Platform platform, DebugMatchMode debugMatchMode, const QString &prefix)
Definition utils.cpp:89
bool runProcess(const QString &binary, const QStringList &args, const QString &workingDirectory, unsigned long *exitCode, QByteArray *stdOut, QByteArray *stdErr, QString *errorMessage)
Definition utils.cpp:312
bool isBuildDirectory(Platform platform, const QString &dirName)
Definition utils.cpp:38
DebugMatchMode
Definition utils.h:153