diff --git a/doc/qtcreator/src/overview/creator-only/creator-design-overview.qdoc b/doc/qtcreator/src/overview/creator-only/creator-design-overview.qdoc index b13107a867a..1832facb558 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-design-overview.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-design-overview.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -58,9 +58,11 @@ Furthermore, features such as widget promotion and custom plugins allow you to use your own widgets with \QD. - \li \l{Best Practices} + \li \l{Optimizing Applications for Mobile Devices} - Apply the best practices to ensure that the UIs you create work - efficiently on the intended platforms, such as mobile devices. + Before starting application development, analyze and define the + requirements, scope, and functionality of the application to ensure + efficient functionality and a smooth user experience on mobile + devices. \endlist */ diff --git a/doc/qtdesignstudio/images/icons/visibility-off.png b/doc/qtdesignstudio/images/icons/visibility-off.png new file mode 100644 index 00000000000..72457cc05fa Binary files /dev/null and b/doc/qtdesignstudio/images/icons/visibility-off.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-action-area-properties.png b/doc/qtdesignstudio/images/studio-flow-action-area-properties.png index efacaf237a1..9e69282fe80 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-action-area-properties.png and b/doc/qtdesignstudio/images/studio-flow-action-area-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-action-area.png b/doc/qtdesignstudio/images/studio-flow-action-area.png index 830985074cb..531af8aab57 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-action-area.png and b/doc/qtdesignstudio/images/studio-flow-action-area.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-decision-properties.png b/doc/qtdesignstudio/images/studio-flow-decision-properties.png index 0877f728b5c..dbaba5338f7 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-decision-properties.png and b/doc/qtdesignstudio/images/studio-flow-decision-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-decision.png b/doc/qtdesignstudio/images/studio-flow-decision.png index 44f1e8f3804..0880a14559b 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-decision.png and b/doc/qtdesignstudio/images/studio-flow-decision.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-effect-properties.png b/doc/qtdesignstudio/images/studio-flow-effect-properties.png index ae841a00827..e240eef88c2 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-effect-properties.png and b/doc/qtdesignstudio/images/studio-flow-effect-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-effect-push-properties.png b/doc/qtdesignstudio/images/studio-flow-effect-push-properties.png index a4cac374741..cd006fb3efb 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-effect-push-properties.png and b/doc/qtdesignstudio/images/studio-flow-effect-push-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-item-properties.png b/doc/qtdesignstudio/images/studio-flow-item-properties.png index 28384e22773..e56e7a622f9 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-item-properties.png and b/doc/qtdesignstudio/images/studio-flow-item-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-transition-line-properties.png b/doc/qtdesignstudio/images/studio-flow-transition-line-properties.png index e0d16766564..93c948e7ece 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-transition-line-properties.png and b/doc/qtdesignstudio/images/studio-flow-transition-line-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-transition-properties-question.png b/doc/qtdesignstudio/images/studio-flow-transition-properties-question.png index 65e1f8b6ba9..80cb7ad1a99 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-transition-properties-question.png and b/doc/qtdesignstudio/images/studio-flow-transition-properties-question.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-transition-properties.png b/doc/qtdesignstudio/images/studio-flow-transition-properties.png index 9a13e71f5c6..e754f3012e7 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-transition-properties.png and b/doc/qtdesignstudio/images/studio-flow-transition-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-view-create.png b/doc/qtdesignstudio/images/studio-flow-view-create.png new file mode 100644 index 00000000000..85fd9c276f1 Binary files /dev/null and b/doc/qtdesignstudio/images/studio-flow-view-create.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-view-properties-transition.png b/doc/qtdesignstudio/images/studio-flow-view-properties-transition.png index c4be840f6b3..f26c74f654d 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-view-properties-transition.png and b/doc/qtdesignstudio/images/studio-flow-view-properties-transition.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-view-properties.png b/doc/qtdesignstudio/images/studio-flow-view-properties.png index 83bf37d9f50..95fe403b76c 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-view-properties.png and b/doc/qtdesignstudio/images/studio-flow-view-properties.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-view.png b/doc/qtdesignstudio/images/studio-flow-view.png index 30938d0bfe3..1eda708fcb4 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-view.png and b/doc/qtdesignstudio/images/studio-flow-view.png differ diff --git a/doc/qtdesignstudio/images/studio-flow-wildcard-properties.png b/doc/qtdesignstudio/images/studio-flow-wildcard-properties.png index 21ec962071c..944fd79431d 100644 Binary files a/doc/qtdesignstudio/images/studio-flow-wildcard-properties.png and b/doc/qtdesignstudio/images/studio-flow-wildcard-properties.png differ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-app-flows.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-app-flows.qdoc index 62be3301a8a..5c3ed81b77b 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-app-flows.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-app-flows.qdoc @@ -96,8 +96,14 @@ \uicontrol {Qt Quick Files} > \uicontrol {Flow View} and follow the instructions of the wizard. - You only need to select the \uicontrol {Use event simulator} check box if - you want to add an event simulator to the flow view. + \image studio-flow-view-create.png "Create Flow View wizard template" + + You only need to select the \uicontrol {Use Event Simulator} check box if + you want to add an event simulator to the flow view. The event simulator + needs the project to be imported to the flow view, so you also need + to select the \uicontrol {Use Application Import} check box. You need the + import also for access to the project \c Constants.qml file that contains + global settings for the project. The flow view properties enable you to adjust the appearance of all the items in the flow: action areas, transition lines, decisions, and @@ -114,8 +120,9 @@ \section1 Flow View Properties You can specify basic properties for a \uicontrol {Flow View} component - in the \l {Type}{Component}, \l {2D Geometry}{Geometry}, and - \l Visibility groups. + in the \l {Type}{Component}, \l {2D Geometry}{Geometry - 2D}, and + \l Visibility sections in the \l Properties view. Specify flow view + properties in the \uicontrol {Flow View} section. \image studio-flow-view-properties.png "Flow View component properties" @@ -199,14 +206,14 @@ \li Drag-and-drop components from \uicontrol Library to a flow item in \l {Form Editor} or \l Navigator. \li Drag a screen from \uicontrol Library > \uicontrol Components - \uicontrol {My Components} to a flow item in + > \uicontrol {My Components} to a flow item in \uicontrol {Form Editor} or \uicontrol Navigator. \endlist \li In \l Properties, edit the properties of each flow item. \endlist You can now drag the flow items from \uicontrol Library > \uicontrol Components - \uicontrol {My Components} to the flow view in \uicontrol {Form Editor} + > \uicontrol {My Components} to the flow view in \uicontrol {Form Editor} or \uicontrol Navigator. When you have all the flow items in place, you can \l{Adding Action Areas and Transitions}{add action areas} to them to create transitions between them. @@ -214,8 +221,9 @@ \section1 Flow Item Properties You can specify basic properties for a \uicontrol {Flow Item} component - in the \l {Type}{Component}, \l {2D Geometry}{Geometry}, and - \l Visibility groups. + in the \l {Type}{Component}, \l {2D Geometry}{Geometry - 2D}, and + \l Visibility sections in the \uicontrol Properties view. Specify flow item + properties in the \uicontrol {Flow Item} section. \image studio-flow-item-properties.png "Flow Item properties" @@ -226,9 +234,16 @@ To include another flow view into a flow view, select the UI file (.ui.qml) that specifies the flow view in the \uicontrol {Loader source} field. + Usually, a flow item is inactive and invisible when it is not currently + selected in the flow. Especially, all events from the flow item are ignored. + To make a flow item always active, so that another flow item within it + can respond to events and trigger the opening of a dialog, for example, + select the \uicontrol {Force active} check box. + By default, transitions are drawn from action areas to the target flow item. To draw the transitions from the edges of flow items instead, select the - \uicontrol {Join lines} check box. + \uicontrol {Join lines} check box in the \uicontrol {Transition Lines} + section. In the \uicontrol Layout tab, you can use \l{Setting Anchors and Margins} {anchors} to position the component. @@ -297,10 +312,8 @@ You can specify basic properties for \uicontrol {Flow Action Area} and \uicontrol {Flow Transition} components in the \l {Type}{Component}, - \l {2D Geometry}{Geometry}, and \l Visibility groups. - - You can use the \l{Picking Colors}{color picker} to set line and fill - color. + \l {2D Geometry}{Geometry - 2D}, and \l Visibility sections in the + \uicontrol Properties view. In the \uicontrol Layout tab, you can use \l{Setting Anchors and Margins} {anchors} to position the component. @@ -310,9 +323,13 @@ \section1 Flow Action Area Properties + In the \uicontrol {Flow Action Area} section, you can use the + \l{Picking Colors}{color picker} to set line and fill color. + \image studio-flow-action-area-properties.png "Flow Action Area properties" - You can specify some additional properties for action areas: + In the \uicontrol {Flow Action} and \uicontrol {Action Area} sections, + specify additional properties for action areas: \list \li Select the \uicontrol {Go back} check box to specify that the @@ -331,8 +348,8 @@ \section1 Flow Transition Properties - You can specify some additional properties for transitions between - \l{Adding Flow Items}{flow items}: + In the \uicontrol Transition section, specify additional properties for + transitions between \l{Adding Flow Items}{flow items}: \image studio-flow-transition-properties.png "Flow Transition properties" @@ -361,8 +378,8 @@ \list \li In the \uicontrol {Line width} field, set the width of the transition line. - \li In the \uicontrol {In-offset}, \uicontrol {Out-offset}, and - \uicontrol {Break-offset} fields, set the start or end point of a + \li In the \uicontrol {Offset} and \uicontrol {Break offset} fields, set + the start point (\uicontrol Out) or end point (\uicontrol In) of a transition line or a break to the specified offset. This enables you to move them up and down or left and right. \li Select the \uicontrol {Dashed line} check box to draw a dashed line. @@ -429,7 +446,8 @@ \section1 Flow Effect Properties You can specify basic properties for a \uicontrol {Flow Effect} - component in the \l Type and \l ID fields. + component in the \l Type and \l ID fields in the \uicontrol Component + section in the \uicontrol Properties view. \image studio-flow-effect-properties.png "Flow Effect properties" @@ -567,7 +585,7 @@ \li Select the flow decision, and then select \uicontrol Connect in the context menu to create connections to the flow items that will open depending on whether the condition is met. - \li In \uicontrol Properties, \uicontrol {Dialog title} field, enter a + \li In the \l Properties view, \uicontrol {Dialog title} field, enter a title for the selection dialog that opens when the condition is triggered. \li Select a transition line in \uicontrol Navigator or @@ -587,8 +605,10 @@ \section1 Flow Decision Properties - You can specify basic properties for a \uicontrol {Flow Decision} - component in the \l Type and \l ID fields. + You can specify basic properties for a \uicontrol {Flow Decision} component + in the \l Type and \l ID fields in the \uicontrol Component section in the + \uicontrol Properties view. Specify properties for flow decisions in the + \uicontrol {Flow Decision} section. \image studio-flow-decision-properties.png "Flow Decision properties" @@ -600,8 +620,9 @@ : \list - \li Select the \uicontrol {Show label} check box to display the ID - of the \uicontrol {Flow Decision} component in \l {Form Editor}. + \li Select \inlineimage icons/visibility-off.png + to display the ID of the \uicontrol {Flow Decision} + component in \l {Form Editor}. \li In the \uicontrol {Label position} field, select the corner of the flow decision icon to place the label in. \li In the \uicontrol Size field, specify the size of the flow @@ -683,17 +704,22 @@ \section1 Flow Wildcard Properties - You can specify basic properties for a \uicontrol {Flow Wildcard} - component in the \l Type and \l ID fields. + You can specify basic properties for a \uicontrol {Flow Wildcard} component + in the \l Type and \l ID fields in the \uicontrol Component section in the + \uicontrol Properties view. Specify properties for flow wildcards in the + \uicontrol {Flow Wildcard} section. \image studio-flow-wildcard-properties.png "Flow Wildcard properties" In the \uicontrol {Event IDs} field, specify the IDs of the events to connect to, such as mouse, touch or keyboard events. + Select the \uicontrol {Global wildcard} check box to enable triggering + the wildcard from several flows. + To give flow items high priority, select them in the - \uicontrol {Positive list} field. To block flow items, - select them in the \uicontrol {Negative list} field. + \uicontrol {Allow list} field. To block flow items, + select them in the \uicontrol {Block list} field. You can specify the following properties to change the appearance of the wildcard icon \inlineimage icons/flow-wildcard-icon.png diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 9dc2f8cda23..80bfabebd58 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1533,4 +1533,9 @@ void NodeInstanceServer::registerFonts(const QUrl &resourceUrl) const QFontDatabase::addApplicationFont(it.next()); } +bool NodeInstanceServer::isInformationServer() const +{ + return false; +} + } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 72c9c447bee..47dfd6c0b50 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -216,6 +216,8 @@ public: virtual QImage grabWindow() = 0; virtual QImage grabItem(QQuickItem *item) = 0; + virtual bool isInformationServer() const; + public slots: void refreshLocalFileProperty(const QString &path); void refreshDummyData(const QString &path); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index ad9de63f57e..19e864e6381 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -2085,6 +2085,11 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst #endif } +bool Qt5InformationNodeInstanceServer::isInformationServer() const +{ + return true; +} + // update 3D view size when it changes in creator side void Qt5InformationNodeInstanceServer::update3DViewState(const Update3dViewStateCommand &command) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index ed4f97d81be..d827075c452 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -75,6 +75,8 @@ public: void handleInstanceLocked(const ServerNodeInstance &instance, bool enable, bool checkAncestors) override; void handleInstanceHidden(const ServerNodeInstance &instance, bool enable, bool checkAncestors) override; + bool isInformationServer() const override; + private slots: void handleSelectionChanged(const QVariant &objs); void handleObjectPropertyCommit(const QVariant &objects, const QVariant &propNames); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp index 6c914bf3ea8..1e8828f6849 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp @@ -58,18 +58,15 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) : NodeInstanceClientProxy(parent) { prioritizeDown(); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - const bool qt6 = false; -#else - const bool qt6 = true; -#endif const bool unifiedRenderPath = qEnvironmentVariableIsSet("QMLPUPPET_UNIFIED_RENDER_PATH"); if (unifiedRenderPath) Internal::QuickItemNodeInstance::enableUnifiedRenderPath(true); - else if (!qt6) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + else DesignerSupport::activateDesignerWindowManager(); +#endif if (QCoreApplication::arguments().at(1) == QLatin1String("--readcapturedstream")) { qputenv("DESIGNER_DONT_USE_SHARED_MEMORY", "1"); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index 51b1dcd1c06..ab38b33aafe 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -295,6 +295,27 @@ bool QuickItemNodeInstance::unifiedRenderPathOrQt6() #endif } +void QuickItemNodeInstance::setHiddenInEditor(bool hide) +{ + ObjectNodeInstance::setHiddenInEditor(hide); + if (s_unifiedRenderPath && !nodeInstanceServer()->isInformationServer()) { + QQmlProperty property(object(), "visible", context()); + + if (!property.isValid()) + return; + + bool visible = property.read().toBool(); + + if (hide && visible) { + setPropertyVariant("visible", false); + m_hidden = true; + } else if (!hide && !visible && m_hidden) { + setPropertyVariant("visible", true); + m_hidden = false; + } + } +} + QRectF QuickItemNodeInstance::contentItemBoundingBox() const { if (contentItem()) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index 7e9bd53341f..5f2f2089135 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -106,6 +106,8 @@ public: static bool unifiedRenderPath(); static bool unifiedRenderPathOrQt6(); + void setHiddenInEditor(bool b) override; + protected: explicit QuickItemNodeInstance(QQuickItem*); QQuickItem *quickItem() const; @@ -139,6 +141,7 @@ private: //variables double m_y; double m_width; double m_height; + bool m_hidden = false; static bool s_createEffectItem; static bool s_unifiedRenderPath; }; diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index e47917a080a..345a49b2b1a 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1134,46 +1134,6 @@ void AndroidConfigurations::registerNewToolChains() registerCustomToolChainsAndDebuggers(); } -void AndroidConfigurations::registerCustomToolChainsAndDebuggers() -{ - const QList existingAndroidToolChains = ToolChainManager::toolChains( - Utils::equal(&ToolChain::typeId, Id(Constants::ANDROID_TOOLCHAIN_TYPEID))); - QList customNdks = Utils::transform(currentConfig().getCustomNdkList(), - FilePath::fromString); - QList customToolchains - = AndroidToolChainFactory::autodetectToolChainsFromNdks(existingAndroidToolChains, - customNdks, - true); - for (ToolChain *tc : customToolchains) { - ToolChainManager::registerToolChain(tc); - - const FilePath ndk = static_cast(tc)->ndkLocation(); - const FilePath command = AndroidConfigurations::currentConfig() - .gdbPathFromNdk(tc->targetAbi(), ndk); - - const Debugger::DebuggerItem *existing = Debugger::DebuggerItemManager::findByCommand( - command); - QString abiStr - = static_cast(tc)->platformLinkerFlags().at(1).split('-').first(); - Abi abi = Abi::abiFromTargetTriplet(abiStr); - if (existing && existing->abis().contains(abi)) - continue; - - Debugger::DebuggerItem debugger; - debugger.setCommand(command); - debugger.setEngineType(Debugger::GdbEngineType); - debugger.setUnexpandedDisplayName( - AndroidConfigurations::tr("Custom Android Debugger (%1, NDK %2)") - .arg(abiStr, - AndroidConfigurations::currentConfig().ndkVersion(ndk).toString())); - debugger.setAutoDetected(true); - debugger.setAbi(abi); - debugger.reinitializeFromFile(); - - Debugger::DebuggerItemManager::registerDebugger(debugger); - } -} - void AndroidConfigurations::removeOldToolChains() { const auto tcs = ToolChainManager::toolChains(Utils::equal(&ToolChain::typeId, @@ -1186,19 +1146,18 @@ void AndroidConfigurations::removeOldToolChains() void AndroidConfigurations::removeUnusedDebuggers() { - QVector uniqueNdks; const QList qtVersions = QtVersionManager::versions([](const BaseQtVersion *v) { return v->type() == Constants::ANDROIDQT; }); + QVector uniqueNdks; for (const BaseQtVersion *qt : qtVersions) { FilePath ndkLocation = currentConfig().ndkLocation(qt); if (!uniqueNdks.contains(ndkLocation)) uniqueNdks.append(ndkLocation); } - uniqueNdks.append(Utils::transform(currentConfig().getCustomNdkList(), FilePath::fromString).toVector()); @@ -1215,19 +1174,27 @@ void AndroidConfigurations::removeUnusedDebuggers() } } - if (!isChildOfNdk && debugger.isAutoDetected()) + const bool isMultiAbiNdkGdb = debugger.command().fileName().startsWith("gdb"); + const bool hasMultiAbiName = debugger.displayName().contains("Multi-Abi"); + + if (debugger.isAutoDetected() && (!isChildOfNdk || (isMultiAbiNdkGdb && !hasMultiAbiName))) Debugger::DebuggerItemManager::deregisterDebugger(debugger.id()); } } -static bool containsAllAbis(const QStringList &abis) +static QStringList allSupportedAbis() { - QStringList supportedAbis{ + return QStringList{ ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A, ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A, ProjectExplorer::Constants::ANDROID_ABI_X86, ProjectExplorer::Constants::ANDROID_ABI_X86_64, }; +} + +static bool containsAllAbis(const QStringList &abis) +{ + QStringList supportedAbis{allSupportedAbis()}; for (const QString &abi : abis) if (supportedAbis.contains(abi)) supportedAbis.removeOne(abi); @@ -1235,28 +1202,25 @@ static bool containsAllAbis(const QStringList &abis) return supportedAbis.isEmpty(); } +static QString getMultiOrSingleAbiString(const QStringList &abis) +{ + return containsAllAbis(abis) ? "Multi-Abi" : abis.join(","); +} + static QVariant findOrRegisterDebugger(ToolChain *tc, const QStringList &abisList, - const BaseQtVersion *qtVersion) + bool customDebugger = false) { - const FilePath command = AndroidConfigurations::currentConfig().gdbPath(tc->targetAbi(), - qtVersion); + const auto ¤tConfig = AndroidConfigurations::currentConfig(); + const FilePath ndk = static_cast(tc)->ndkLocation(); + const FilePath command = currentConfig.gdbPathFromNdk(tc->targetAbi(), ndk); + // check if the debugger is already registered, but ignoring the display name const Debugger::DebuggerItem *existing = Debugger::DebuggerItemManager::findByCommand(command); - QList abis = Utils::transform(abisList, Abi::abiFromTargetTriplet); - - auto containsAbis = [abis](const Abis &secondAbis) { - for (const Abi &abi : secondAbis) { - if (!abis.contains(abi)) - return false; - } - return true; - }; - - if (existing && existing->engineType() == Debugger::GdbEngineType && existing->isAutoDetected() - && containsAbis(existing->abis())) { - // update debugger info with new + // Return existing debugger with same command + if (existing && existing->engineType() == Debugger::GdbEngineType + && existing->isAutoDetected()) { return existing->id(); } @@ -1264,16 +1228,39 @@ static QVariant findOrRegisterDebugger(ToolChain *tc, Debugger::DebuggerItem debugger; debugger.setCommand(command); debugger.setEngineType(Debugger::GdbEngineType); - debugger.setUnexpandedDisplayName( - AndroidConfigurations::tr("Android Debugger (%1, NDK %2)") - .arg(containsAllAbis(abisList) ? "Multi-Abi" : abisList.join(",")) - .arg(AndroidConfigurations::currentConfig().ndkVersion(qtVersion).toString())); + + // NDK 10 and older have multiple gdb versions per ABI, so check for that. + const bool oldNdkVersion = currentConfig.ndkVersion(ndk) <= QVersionNumber{11}; + QString mainName = AndroidConfigurations::tr("Android Debugger (%1, NDK %2)"); + if (customDebugger) + mainName.prepend("Custom "); + debugger.setUnexpandedDisplayName(mainName + .arg(getMultiOrSingleAbiString(oldNdkVersion ? abisList : allSupportedAbis())) + .arg(AndroidConfigurations::currentConfig().ndkVersion(ndk).toString())); debugger.setAutoDetected(true); - debugger.setAbis(abis.toVector()); debugger.reinitializeFromFile(); return Debugger::DebuggerItemManager::registerDebugger(debugger); } +void AndroidConfigurations::registerCustomToolChainsAndDebuggers() +{ + const QList existingAndroidToolChains = ToolChainManager::toolChains( + Utils::equal(&ToolChain::typeId, Utils::Id(Constants::ANDROID_TOOLCHAIN_TYPEID))); + QList customNdks = Utils::transform(currentConfig().getCustomNdkList(), + FilePath::fromString); + QList customToolchains + = AndroidToolChainFactory::autodetectToolChainsFromNdks(existingAndroidToolChains, + customNdks, + true); + for (ToolChain *tc : customToolchains) { + ToolChainManager::registerToolChain(tc); + const auto androidToolChain = static_cast(tc); + QString abiStr; + if (androidToolChain) + abiStr = androidToolChain->platformLinkerFlags().at(1).split('-').first(); + findOrRegisterDebugger(tc, {abiStr}, true); + } +} void AndroidConfigurations::updateAutomaticKitList() { for (Kit *k : KitManager::kits()) { @@ -1362,7 +1349,7 @@ void AndroidConfigurations::updateAutomaticKitList() QtKitAspect::setQtVersion(k, qt); DeviceKitAspect::setDevice(k, device); QStringList abis = static_cast(qt)->androidAbis(); - Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis, QtKitAspect::qtVersion(k))); + Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis)); k->setSticky(ToolChainKitAspect::id(), true); k->setSticky(QtKitAspect::id(), true); @@ -1374,7 +1361,7 @@ void AndroidConfigurations::updateAutomaticKitList() versionStr = QString("%1").arg(qt->displayName()); k->setUnexpandedDisplayName(tr("Android %1 Clang %2") .arg(versionStr) - .arg(containsAllAbis(abis) ? "Multi-Abi" : abis.join(","))); + .arg(getMultiOrSingleAbiString(abis))); k->setValueSilently(Constants::ANDROID_KIT_NDK, currentConfig().ndkLocation(qt).toString()); k->setValueSilently(Constants::ANDROID_KIT_SDK, currentConfig().sdkLocation().toString()); }; diff --git a/src/plugins/help/CMakeLists.txt b/src/plugins/help/CMakeLists.txt index c5be1ef1605..e63599eb07e 100644 --- a/src/plugins/help/CMakeLists.txt +++ b/src/plugins/help/CMakeLists.txt @@ -57,7 +57,7 @@ endif () option(BUILD_HELPVIEWERBACKEND_QTWEBENGINE "Build QtWebEngine based help viewer backend." ${BUILD_HELPVIEWERBACKEND_QTWEBENGINE_DEFAULT}) find_package(Qt5 COMPONENTS WebEngineWidgets QUIET) extend_qtc_plugin(Help - CONDITION BUILD_HELVIEWERBACKEND_QTWEBENGINE AND TARGET Qt5::WebEngineWidgets + CONDITION BUILD_HELPVIEWERBACKEND_QTWEBENGINE AND TARGET Qt5::WebEngineWidgets FEATURE_INFO "QtWebEngine help viewer" DEPENDS Qt5::WebEngineWidgets DEFINES QTC_WEBENGINE_HELPVIEWER diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index 7daedb9911b..0b1388a3480 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -74,6 +74,7 @@ public: quint64 hash() const override; const QString &sortText() const; + bool hasSortText() const; bool operator <(const LanguageClientCompletionItem &other) const; @@ -216,6 +217,11 @@ const QString &LanguageClientCompletionItem::sortText() const return m_sortText; } +bool LanguageClientCompletionItem::hasSortText() const +{ + return m_item.sortText().has_value(); +} + QString LanguageClientCompletionItem::filterText() const { if (m_filterText.isEmpty()) { @@ -257,13 +263,21 @@ class LanguageClientCompletionModel : public GenericProposalModel public: // GenericProposalModel interface bool containsDuplicates() const override { return false; } - bool isSortable(const QString &/*prefix*/) const override { return true; } + bool isSortable(const QString &/*prefix*/) const override; void sort(const QString &/*prefix*/) override; bool supportsPrefixExpansion() const override { return false; } QList items() const { return m_currentItems; } }; +bool LanguageClientCompletionModel::isSortable(const QString &) const +{ + return Utils::anyOf(items(), [](AssistProposalItemInterface *i) { + auto item = dynamic_cast(i); + return !item || item->hasSortText(); + }); +} + void LanguageClientCompletionModel::sort(const QString &/*prefix*/) { std::sort(m_currentItems.begin(), m_currentItems.end(), diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index c1d4c181b61..c05f8df459f 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -172,9 +172,8 @@ Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplore QTC_ASSERT(managerInstance, return nullptr); QTC_ASSERT(setting, return nullptr); QTC_ASSERT(setting->isValid(), return nullptr); - Client *client = setting->createClient(); + Client *client = setting->createClient(project); QTC_ASSERT(client, return nullptr); - client->setCurrentProject(project); client->start(); managerInstance->m_clientsForSetting[setting->m_id].append(client); return client; diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 8787a37b1a7..0745d6f1732 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -557,16 +557,22 @@ bool BaseSettings::isValid() const } Client *BaseSettings::createClient() +{ + return createClient(nullptr); +} + +Client *BaseSettings::createClient(ProjectExplorer::Project *project) { if (!isValid() || !m_enabled) return nullptr; - BaseClientInterface *interface = createInterface(); + BaseClientInterface *interface = createInterfaceWithProject(project); QTC_ASSERT(interface, return nullptr); auto *client = createClient(interface); client->setName(Utils::globalMacroExpander()->expand(m_name)); client->setSupportedLanguage(m_languageFilter); client->setInitializationOptions(initializationOptions()); client->setActivateDocumentAutomatically(true); + client->setCurrentProject(project); return client; } @@ -733,10 +739,12 @@ Utils::CommandLine StdIOSettings::command() const Utils::CommandLine::Raw); } -BaseClientInterface *StdIOSettings::createInterface() const +BaseClientInterface *StdIOSettings::createInterfaceWithProject(ProjectExplorer::Project *project) const { auto interface = new StdIOClientInterface; interface->setCommandLine(command()); + if (project) + interface->setWorkingDirectory(project->projectDirectory().toString()); return interface; } diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index 5ee567b0718..b964fbca5d7 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -96,12 +96,18 @@ public: virtual BaseSettings *copy() const { return new BaseSettings(*this); } virtual bool isValid() const; Client *createClient(); + Client *createClient(ProjectExplorer::Project *project); virtual QVariantMap toMap() const; virtual void fromMap(const QVariantMap &map); protected: + // TODO: remove in Qt Creator 6 and rename createInterfaceWithProject back to it virtual BaseClientInterface *createInterface() const { return nullptr; } virtual Client *createClient(BaseClientInterface *interface) const; + virtual BaseClientInterface *createInterfaceWithProject(ProjectExplorer::Project *) const + { + return createInterface(); + } BaseSettings(const BaseSettings &other) = default; BaseSettings(BaseSettings &&other) = default; @@ -131,7 +137,7 @@ public: Utils::CommandLine command() const; protected: - BaseClientInterface *createInterface() const override; + BaseClientInterface *createInterfaceWithProject(ProjectExplorer::Project *project) const override; StdIOSettings(const StdIOSettings &other) = default; StdIOSettings(StdIOSettings &&other) = default; diff --git a/src/plugins/perfprofiler/perfprofilertraceview.cpp b/src/plugins/perfprofiler/perfprofilertraceview.cpp index bc2df091520..a330b6eb9a9 100644 --- a/src/plugins/perfprofiler/perfprofilertraceview.cpp +++ b/src/plugins/perfprofiler/perfprofilertraceview.cpp @@ -76,7 +76,11 @@ PerfProfilerTraceView::PerfProfilerTraceView(QWidget *parent, PerfProfilerTool * bool PerfProfilerTraceView::isUsable() const { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return quickWindow()->rendererInterface()->graphicsApi() == QSGRendererInterface::OpenGL; +#else + return QSGRendererInterface::isApiRhiBased(quickWindow()->rendererInterface()->graphicsApi()); +#endif } void PerfProfilerTraceView::selectByTypeId(int typeId) diff --git a/src/plugins/projectexplorer/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp index 47dcd7b8db4..bdef83438ac 100644 --- a/src/plugins/projectexplorer/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -35,7 +35,7 @@ using namespace Utils; // As of MSVC 2015: "foo.cpp(42) :" -> "foo.cpp(42):" -static const char FILE_POS_PATTERN[] = "^(?:\\d+>)?(cl|LINK|.+[^ ]) ?: "; +static const char FILE_POS_PATTERN[] = "^(?:\\d+>)?(cl|LINK|.+?[^ ]) ?: "; static QPair parseFileName(const QString &input) { @@ -398,6 +398,24 @@ void ProjectExplorerPlugin::testMsvcOutputParsers_data() FilePath::fromUserInput("x:\\src\\plugins\\projectexplorer\\msvcparser.cpp"), 69)) << ""; + QTest::newRow("labeled chained warning") + << "x:\\src\\libs\\narf\\stringutils.cpp(155): warning C4996: " + "'std::wstring_convert" + ",wchar_t,std::allocator,std::allocator>::from_bytes': " + "warning STL4017: std::wbuffer_convert, std::wstring_convert, and the " + "header (containing std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and " + "std::codecvt_utf8_utf16) are deprecated in C++17. more blabla" + << OutputParserTester::STDOUT + << "" << "" + << (Tasks() + << CompileTask(Task::Warning, + "STL4017: std::wbuffer_convert, std::wstring_convert, and the " + " header (containing std::codecvt_mode, std::codecvt_utf8, " + "std::codecvt_utf16, and std::codecvt_utf8_utf16) are deprecated in " + "C++17. more blabla", + FilePath::fromUserInput("x:\\src\\libs\\narf\\stringutils.cpp"), 155)) + << ""; + QTest::newRow("additional information") << "x:\\src\\plugins\\texteditor\\icompletioncollector.h(50) : warning C4099: 'TextEditor::CompletionItem' : type name first seen using 'struct' now seen using 'class'\n" " x:\\src\\plugins\\texteditor\\completionsupport.h(39) : see declaration of 'TextEditor::CompletionItem'" diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 8c92b19445a..179f8b540aa 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -850,7 +850,9 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags, cxxFlags << "/TP"; if (!enableRtti.isUndefined()) cxxFlags << QLatin1String(enableRtti.toBool() ? "/GR" : "/GR-"); - if (getCppProp("cxxLanguageVersion").toArray().contains("c++17")) + if (getCppProp("cxxLanguageVersion").toArray().contains("c++20")) + cxxFlags << "/std:c++20"; + else if (getCppProp("cxxLanguageVersion").toArray().contains("c++17")) cxxFlags << "/std:c++17"; } } diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index e9c47ccae47..961d3914059 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -226,6 +226,7 @@ public: qint32 internalId() const; void setNodeSource(const QString&); + void setNodeSource(const QString &newNodeSource, NodeSourceType type); QString nodeSource() const; QString convertTypeToImportAlias() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index e2887782abe..6ecde66a309 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -642,6 +642,9 @@ void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & NodeInstance instance = instanceForModelNode(node); ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource); m_nodeInstanceServer->changeNodeSource(changeNodeSourceCommand); + + // Puppet doesn't deal with node source changes properly, so just reset the puppet for now + delayedRestartProcess(); // TODO: Remove this once the issue is properly fixed (QDS-4955) } } @@ -1809,22 +1812,24 @@ void NodeInstanceView::updateWatcher(const QString &path) QStringList newFiles; QStringList newDirs; + const QStringList files = m_fileSystemWatcher->files(); + const QStringList directories = m_fileSystemWatcher->directories(); if (path.isEmpty()) { // Do full update rootPath = QFileInfo(model()->fileUrl().toLocalFile()).absolutePath(); - m_fileSystemWatcher->removePaths(m_fileSystemWatcher->directories()); - m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files()); + if (!directories.isEmpty()) + m_fileSystemWatcher->removePaths(directories); + if (!files.isEmpty()) + m_fileSystemWatcher->removePaths(files); } else { rootPath = path; - const QStringList files = m_fileSystemWatcher->files(); - const QStringList dirs = m_fileSystemWatcher->directories(); for (const auto &file : files) { if (file.startsWith(path)) oldFiles.append(file); } - for (const auto &dir : dirs) { - if (dir.startsWith(path)) - oldDirs.append(dir); + for (const auto &directory : directories) { + if (directory.startsWith(path)) + oldDirs.append(directory); } } diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 0e40c8edabe..64b51ff69fa 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -1278,6 +1278,22 @@ void ModelNode::setNodeSource(const QString &newNodeSource) m_model.data()->d->setNodeSource(internalNode(), newNodeSource); } +void ModelNode::setNodeSource(const QString &newNodeSource, NodeSourceType type) +{ + Internal::WriteLocker locker(m_model.data()); + + if (!isValid()) { + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid"); + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + } + + if (internalNode()->nodeSourceType() == type && internalNode()->nodeSource() == newNodeSource) + return; + + internalNode()->setNodeSourceType(type); // Set type first as it doesn't trigger any notifies + m_model.data()->d->setNodeSource(internalNode(), newNodeSource); +} + QString ModelNode::nodeSource() const { if (!isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 3c6a64d02c2..f3fb6f5cfda 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -2086,7 +2086,7 @@ void TextToModelMerger::setupComponent(const ModelNode &node) return; //No object definition found if (node.nodeSource() != result) - ModelNode(node).setNodeSource(result); + ModelNode(node).setNodeSource(result, ModelNode::NodeWithComponentSource); } void TextToModelMerger::collectLinkErrors(QList *errors, const ReadingContext &ctxt) @@ -2256,7 +2256,7 @@ void TextToModelMerger::setupCustomParserNode(const ModelNode &node) return; if (node.nodeSource() != modelText) - ModelNode(node).setNodeSource(modelText); + ModelNode(node).setNodeSource(modelText, ModelNode::NodeWithCustomParserSource); } diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp index 3ceae1d712b..4e40644c6f2 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp @@ -296,8 +296,12 @@ void QmlProfilerTraceView::showContextMenu(QPoint position) bool QmlProfilerTraceView::isUsable() const { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return d->m_mainView->quickWindow()->rendererInterface()->graphicsApi() == QSGRendererInterface::OpenGL; +#else + return QSGRendererInterface::isApiRhiBased(d->m_mainView->quickWindow()->rendererInterface()->graphicsApi()); +#endif } bool QmlProfilerTraceView::isSuspended() const diff --git a/tests/auto/tracing/flamegraphview/CMakeLists.txt b/tests/auto/tracing/flamegraphview/CMakeLists.txt index a35961bc524..23f73fde899 100644 --- a/tests/auto/tracing/flamegraphview/CMakeLists.txt +++ b/tests/auto/tracing/flamegraphview/CMakeLists.txt @@ -15,6 +15,10 @@ else() # < Qt 6.2 DEPENDS Tracing Qt5::QuickWidgets Qt5::Quick Utils ) + if (NOT TARGET tst_tracing_flamegraphview) # qt_add_qml_module has no DEPENDS check + return() + endif() + qt_add_qml_module(tst_tracing_flamegraphview URI "QtCreator.TstTracingFlameGraphView" VERSION "1.0" diff --git a/tests/manual/widgets/crumblepath/tst_manual_widgets_crumblepath.cpp b/tests/manual/widgets/crumblepath/tst_manual_widgets_crumblepath.cpp index b86884d6df1..06ba4b04bc4 100644 --- a/tests/manual/widgets/crumblepath/tst_manual_widgets_crumblepath.cpp +++ b/tests/manual/widgets/crumblepath/tst_manual_widgets_crumblepath.cpp @@ -93,7 +93,9 @@ QWidget *shrinkingCrumblePath() int main(int argc, char *argv[]) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif // Qt < 6 QApplication app(argc, argv); diff --git a/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp b/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp index c77a7109b11..67e406c5884 100644 --- a/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp +++ b/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp @@ -39,7 +39,9 @@ using namespace Utils; int main(int argc, char *argv[]) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif // Qt < 6 QApplication app(argc, argv); diff --git a/tests/manual/widgets/manhattanstyle/tst_manual_widgets_manhattanstyle.cpp b/tests/manual/widgets/manhattanstyle/tst_manual_widgets_manhattanstyle.cpp index 59b5d34c926..155ce326452 100644 --- a/tests/manual/widgets/manhattanstyle/tst_manual_widgets_manhattanstyle.cpp +++ b/tests/manual/widgets/manhattanstyle/tst_manual_widgets_manhattanstyle.cpp @@ -123,8 +123,10 @@ static QWidget *centralWidget() int main(int argc, char *argv[]) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif // Qt < 6 QApplication app(argc, argv); diff --git a/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp b/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp index d027536e9e7..ff895a7b385 100644 --- a/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp +++ b/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp @@ -162,8 +162,10 @@ public: int main(int argc, char *argv[]) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif // Qt < 6 QApplication app(argc, argv);