diff --git a/src/androiddeployqt/main.cpp b/src/androiddeployqt/main.cpp index dd5b74bd6101e4a5b1c056422a4fb8fa1112cbd2..51b514f51ab6aa69b331b6bfaee344e791af0fb4 100644 --- a/src/androiddeployqt/main.cpp +++ b/src/androiddeployqt/main.cpp @@ -774,7 +774,8 @@ bool readInputFile(Options *options) { const QJsonValue deploymentDependencies = jsonObject.value(QStringLiteral("deployment-dependencies")); if (!deploymentDependencies.isUndefined()) { - const auto dependencies = deploymentDependencies.toString().splitRef(QLatin1Char(',')); + QString deploymentDependenciesString = deploymentDependencies.toString(); + const auto dependencies = deploymentDependenciesString.splitRef(QLatin1Char(',')); for (const QStringRef &dependency : dependencies) { QString path = options->qtInstallDirectory + QLatin1Char('/') + dependency; if (QFileInfo(path).isDir()) { diff --git a/src/designer/src/components/formeditor/formwindow.h b/src/designer/src/components/formeditor/formwindow.h index bda20077fd260b1937b00e741678d8f987ebb235..aca3547287a26c20be0155c7741632aabfe2759c 100644 --- a/src/designer/src/components/formeditor/formwindow.h +++ b/src/designer/src/components/formeditor/formwindow.h @@ -70,6 +70,13 @@ class QT_FORMEDITOR_EXPORT FormWindow: public FormWindowBase Q_OBJECT public: + enum HandleOperation + { + NoHandleOperation, + ResizeHandleOperation, + ChangeLayoutSpanHandleOperation + }; + explicit FormWindow(FormEditor *core, QWidget *parent = 0, Qt::WindowFlags flags = 0); virtual ~FormWindow(); @@ -199,6 +206,9 @@ public: bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE; + HandleOperation handleOperation() const { return m_handleOperation; } + void setHandleOperation(HandleOperation o) { m_handleOperation = o; } + signals: void contextMenuRequested(QMenu *menu, QWidget *widget); @@ -354,6 +364,7 @@ private: QStringList m_includeHints; QPoint m_contextMenuPosition; + HandleOperation m_handleOperation = NoHandleOperation; private: friend class WidgetEditorTool; diff --git a/src/designer/src/components/formeditor/formwindowmanager.cpp b/src/designer/src/components/formeditor/formwindowmanager.cpp index 2cccd851ef915a0238fa1d8a158401a99f7bbed3..0341c920b3d1d9145fe629406df6940a142fb580 100644 --- a/src/designer/src/components/formeditor/formwindowmanager.cpp +++ b/src/designer/src/components/formeditor/formwindowmanager.cpp @@ -209,6 +209,14 @@ bool FormWindowManager::eventFilter(QObject *o, QEvent *e) return true; } switch (eventType) { + case QEvent::LayoutRequest: + // QTBUG-61439: Suppress layout request while changing the QGridLayout + // span of a QTabWidget, which sends LayoutRequest in resizeEvent(). + if (fw->handleOperation() == FormWindow::ChangeLayoutSpanHandleOperation) { + e->ignore(); + return true; + } + break; case QEvent::WindowActivate: { if (fw->parentWidget()->isWindow() && fw->isMainContainer(managedWidget) && activeFormWindow() != fw) { diff --git a/src/designer/src/components/formeditor/widgetselection.cpp b/src/designer/src/components/formeditor/widgetselection.cpp index eda77e213110016b7914784047778875cd49c667..fcb54de9211af810fc510e95edf00387ae525e31 100644 --- a/src/designer/src/components/formeditor/widgetselection.cpp +++ b/src/designer/src/components/formeditor/widgetselection.cpp @@ -178,6 +178,17 @@ void WidgetHandle::mousePressEvent(QMouseEvent *e) m_origPressPos = container->mapFromGlobal(e->globalPos()); m_geom = m_origGeom = m_widget->geometry(); + + switch (WidgetSelection::widgetState(m_formWindow->core(), m_widget)) { + case WidgetSelection::UnlaidOut: + case WidgetSelection::LaidOut: + m_formWindow->setHandleOperation(FormWindow::ResizeHandleOperation); + break; + case WidgetSelection::ManagedGridLayout: + case WidgetSelection::ManagedFormLayout: + m_formWindow->setHandleOperation(FormWindow::ChangeLayoutSpanHandleOperation); + break; + } } void WidgetHandle::mouseMoveEvent(QMouseEvent *e) @@ -326,6 +337,8 @@ void WidgetHandle::mouseMoveEvent(QMouseEvent *e) void WidgetHandle::mouseReleaseEvent(QMouseEvent *e) { + m_formWindow->setHandleOperation(FormWindow::NoHandleOperation); + if (e->button() != Qt::LeftButton || !m_active) return; diff --git a/src/designer/src/uitools/quiloader_p.h b/src/designer/src/uitools/quiloader_p.h index f9371fac48b963771e823df102cc4fa82092d59d..86e970f49bbeaeed12df0e1cc6857978a6fc85bf 100644 --- a/src/designer/src/uitools/quiloader_p.h +++ b/src/designer/src/uitools/quiloader_p.h @@ -1,11 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Designer of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the @@ -14,13 +14,24 @@ ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp index 8ec4a6205b9b5d3708523c65032aa83057f23194..8ed6fffdfd2632da68a3b1dc42d6113bde6059fa 100644 --- a/src/windeployqt/main.cpp +++ b/src/windeployqt/main.cpp @@ -817,7 +817,8 @@ static const PluginModuleMapping pluginModuleMappings[] = {"qtwebengine", QtWebEngineModule | QtWebEngineCoreModule | QtWebEngineWidgetsModule}, {"styles", QtWidgetsModule}, {"sceneparsers", Qt3DRendererModule}, - {"renderplugins", Qt3DRendererModule} + {"renderplugins", Qt3DRendererModule}, + {"geometryloaders", Qt3DRendererModule} }; static inline quint64 qtModuleForPlugin(const QString &subDirName) @@ -1048,7 +1049,10 @@ static QString vcRedistDir() const QFileInfoList subDirs = QDir(vc2017RedistDirName).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::Reversed); for (const QFileInfo &f : subDirs) { - const QString path = f.absoluteFilePath(); + QString path = f.absoluteFilePath(); + if (QFileInfo(path + slash + vcDebugRedistDir()).isDir()) + return path; + path += QStringLiteral("/onecore"); if (QFileInfo(path + slash + vcDebugRedistDir()).isDir()) return path; } @@ -1547,6 +1551,7 @@ static bool deployWebEngineCore(const QMap<QString, QString> &qmakeVariables, const Options &options, bool isDebug, QString *errorMessage) { static const char *installDataFiles[] = {"icudtl.dat", + "qtwebengine_devtools_resources.pak", "qtwebengine_resources.pak", "qtwebengine_resources_100p.pak", "qtwebengine_resources_200p.pak"}; diff --git a/src/windeployqt/qmlutils.cpp b/src/windeployqt/qmlutils.cpp index 9e8bb09e25eff1ae4b0b4014baf3250135121bdc..52f04406893000c5d5f658a6534910d29809c0df 100644 --- a/src/windeployqt/qmlutils.cpp +++ b/src/windeployqt/qmlutils.cpp @@ -39,6 +39,11 @@ QT_BEGIN_NAMESPACE +bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2) +{ + return m1.className.isEmpty() ? m1.name == m2.name : m1.className == m2.className; +} + // Return install path (cp -r semantics) QString QmlImportScanResult::Module::installPath(const QString &root) const { @@ -153,19 +158,10 @@ QmlImportScanResult runQmlImportScanner(const QString &directory, const QString return result; } -static inline bool contains(const QList<QmlImportScanResult::Module> &modules, const QString &className) -{ - for (const QmlImportScanResult::Module &m : modules) { - if (m.className == className) - return true; - } - return false; -} - void QmlImportScanResult::append(const QmlImportScanResult &other) { for (const QmlImportScanResult::Module &module : other.modules) { - if (!contains(modules, module.className)) + if (std::find(modules.cbegin(), modules.cend(), module) == modules.cend()) modules.append(module); } for (const QString &plugin : other.plugins) { diff --git a/src/windeployqt/qmlutils.h b/src/windeployqt/qmlutils.h index 5e1ddc619838a8bfea82e862452d0858363f678c..895c7f1de79f6dce05bda298a7e4f0a4394b5fe7 100644 --- a/src/windeployqt/qmlutils.h +++ b/src/windeployqt/qmlutils.h @@ -55,6 +55,8 @@ struct QmlImportScanResult { QStringList plugins; }; +bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2); + QmlImportScanResult runQmlImportScanner(const QString &directory, const QString &qmlImportPath, bool usesWidgets, int platform, DebugMatchMode debugMatchMode, QString *errorMessage); diff --git a/src/winrtrunner/appxlocalengine.cpp b/src/winrtrunner/appxlocalengine.cpp index 3c89d715c5c9799a7f26a353373721c01cf61c4a..d7cf35b312e75d6aff0222bf6573afef1085aadd 100644 --- a/src/winrtrunner/appxlocalengine.cpp +++ b/src/winrtrunner/appxlocalengine.cpp @@ -412,18 +412,6 @@ bool AppxLocalEngine::installPackage(IAppxManifestReader *reader, const QString return false; } - ComPtr<IAsyncInfo> asyncInfo; - hr = deploymentOperation.As(&asyncInfo); - RETURN_FALSE_IF_FAILED("Failed to cast deployment operation to info."); - AsyncStatus status; - hr = asyncInfo->get_Status(&status); - RETURN_FALSE_IF_FAILED("Failed to retrieve deployment operation's status."); - - if (status != Completed) { - qCWarning(lcWinRtRunner) << "Deployment operation did not succeed."; - return false; - } - ComPtr<IDeploymentResult> results; hr = deploymentOperation->GetResults(&results); RETURN_FALSE_IF_FAILED("Failed to retrieve package registration results."); @@ -433,10 +421,15 @@ bool AppxLocalEngine::installPackage(IAppxManifestReader *reader, const QString RETURN_FALSE_IF_FAILED("Failed to retrieve extended error code."); if (FAILED(errorCode)) { - HString errorText; - if (SUCCEEDED(results->get_ErrorText(errorText.GetAddressOf()))) { - qCWarning(lcWinRtRunner) << "Unable to register package:" - << QString::fromWCharArray(errorText.GetRawBuffer(NULL)); + if (HRESULT_CODE(errorCode) == ERROR_INSTALL_PREREQUISITE_FAILED) { + qCWarning(lcWinRtRunner) << "Unable to register package: A requirement for installation was not met. " + "Check that your Windows version matches TargetDeviceFamily's MinVersion set in your AppxManifest.xml."; + } else { + HString errorText; + if (SUCCEEDED(results->get_ErrorText(errorText.GetAddressOf()))) { + qCWarning(lcWinRtRunner) << "Unable to register package:" + << QString::fromWCharArray(errorText.GetRawBuffer(NULL)); + } } if (HRESULT_CODE(errorCode) == ERROR_INSTALL_POLICY_FAILURE) { // The user's license has expired. Give them the opportunity to renew it.