From 82b5cc89cb1e1c5e539c7a7961079b213dbcffe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 5 May 2023 13:11:46 +0200 Subject: [PATCH 01/13] SquishTests: Log used Python version Change-Id: I60cb928382840f34800af6a8ee1ed7f084acfb93 Reviewed-by: Christian Stenger --- tests/system/shared/qtcreator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 543c3c7ad4f..66407519066 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -382,6 +382,7 @@ def copySettingsToTmpDir(destination=None, omitFiles=[]): substituteUnchosenTargetABIs(tmpSettingsDir) SettingsPath = ['-settingspath', '"%s"' % tmpSettingsDir] +test.log("Test is running on Python %s" % sys.version) # current dir is directory holding qtcreator.py origSettingsDir = os.path.abspath(os.path.join(os.getcwd(), "..", "..", "settings")) From 78fe0c315ee18358f0aa2bc3452d3d19efac73b4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 5 May 2023 12:26:48 +0200 Subject: [PATCH 02/13] Debugger: fix vanishing editor tooltip on expand fetchMore is called multiple times before expandNode and seems to invalidate the index that is passed to expandNode. Since we only need to fetch more when we want to expand the item we might as well just integrate the code of fetch more into expandNode. Fixes: QTCREATORBUG-29083 Change-Id: I0e60e9bb03b53de2e86eea232fb5bb98046bbb80 Reviewed-by: hjk --- .../debugger/debuggertooltipmanager.cpp | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index f5e9933fbef..70e52355867 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -266,9 +266,20 @@ public: void expandNode(const QModelIndex &idx) { + if (!m_engine) + return; + m_expandedINames.insert(idx.data(LocalsINameRole).toString()); - if (canFetchMore(idx)) - fetchMore(idx); + if (canFetchMore(idx)) { + if (!idx.isValid()) + return; + + if (auto item = dynamic_cast(itemForIndex(idx))) { + WatchItem *it = m_engine->watchHandler()->findItem(item->iname); + if (QTC_GUARD(it)) + it->model()->fetchMore(it->index()); + } + } } void collapseNode(const QModelIndex &idx) @@ -276,22 +287,6 @@ public: m_expandedINames.remove(idx.data(LocalsINameRole).toString()); } - void fetchMore(const QModelIndex &idx) override - { - if (!idx.isValid()) - return; - auto item = dynamic_cast(itemForIndex(idx)); - if (!item) - return; - QString iname = item->iname; - if (!m_engine) - return; - - WatchItem *it = m_engine->watchHandler()->findItem(iname); - QTC_ASSERT(it, return); - it->model()->fetchMore(it->index()); - } - void restoreTreeModel(QXmlStreamReader &r); QPointer m_engine; From 0e4a7d5207c522c1d25d03212777b00b79b0e360 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 3 May 2023 09:11:28 +0200 Subject: [PATCH 03/13] Utils: Avoid watching directories of watched files Do not watch directories unconditionally, but only if they contain removed files to check whether those files are readded. This should reduce the number of needlesly watched directories to a minimum and fix performance regressions introduced by 61598eca15e14af64c20d314db382973dfccb2d2. Fixes: QTCREATORBUG-28957 Change-Id: I8fe387e7de32b0fb585074330c7f6ca7eae44730 Reviewed-by: Reviewed-by: Ulf Hermann Reviewed-by: hjk --- src/libs/utils/filesystemwatcher.cpp | 59 ++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp index 3f427cce2ea..ad7f77c10e7 100644 --- a/src/libs/utils/filesystemwatcher.cpp +++ b/src/libs/utils/filesystemwatcher.cpp @@ -275,15 +275,19 @@ void FileSystemWatcher::addFiles(const QStringList &files, WatchMode wm) const int count = ++d->m_staticData->m_fileCount[file]; Q_ASSERT(count > 0); - if (count == 1) + if (count == 1) { toAdd << file; - const QString directory = QFileInfo(file).path(); - const int dirCount = ++d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount > 0); + QFileInfo fi(file); + if (!fi.exists()) { + const QString directory = fi.path(); + const int dirCount = ++d->m_staticData->m_directoryCount[directory]; + Q_ASSERT(dirCount > 0); - if (dirCount == 1) - toAdd << directory; + if (dirCount == 1) + toAdd << directory; + } + } } if (!toAdd.isEmpty()) @@ -311,15 +315,19 @@ void FileSystemWatcher::removeFiles(const QStringList &files) const int count = --(d->m_staticData->m_fileCount[file]); Q_ASSERT(count >= 0); - if (!count) + if (!count) { toRemove << file; - const QString directory = QFileInfo(file).path(); - const int dirCount = --d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount >= 0); + QFileInfo fi(file); + if (!fi.exists()) { + const QString directory = fi.path(); + const int dirCount = --d->m_staticData->m_directoryCount[directory]; + Q_ASSERT(dirCount >= 0); - if (!dirCount) - toRemove << directory; + if (!dirCount) + toRemove << directory; + } + } } if (!toRemove.isEmpty()) @@ -418,13 +426,27 @@ QStringList FileSystemWatcher::directories() const void FileSystemWatcher::slotFileChanged(const QString &path) { const auto it = d->m_files.find(path); + QStringList toAdd; if (it != d->m_files.end() && it.value().trigger(path)) { if (debug) qDebug() << this << "triggers on file " << path << it.value().watchMode << it.value().modifiedTime.toString(Qt::ISODate); d->fileChanged(path); + + QFileInfo fi(path); + if (!fi.exists()) { + const QString directory = fi.path(); + const int dirCount = ++d->m_staticData->m_directoryCount[directory]; + Q_ASSERT(dirCount > 0); + + if (dirCount == 1) + toAdd << directory; + } } + + if (!toAdd.isEmpty()) + d->m_staticData->m_watcher->addPaths(toAdd); } void FileSystemWatcher::slotDirectoryChanged(const QString &path) @@ -450,9 +472,20 @@ void FileSystemWatcher::slotDirectoryChanged(const QString &path) for (const QString &rejected : d->m_staticData->m_watcher->addPaths(toReadd)) toReadd.removeOne(rejected); + QStringList toRemove; // If we've successfully added the file, that means it was deleted and replaced. - for (const QString &reAdded : std::as_const(toReadd)) + for (const QString &reAdded : std::as_const(toReadd)) { d->fileChanged(reAdded); + const QString directory = QFileInfo(reAdded).path(); + const int dirCount = --d->m_staticData->m_directoryCount[directory]; + Q_ASSERT(dirCount >= 0); + + if (!dirCount) + toRemove << directory; + } + + if (!toRemove.isEmpty()) + d->m_staticData->m_watcher->removePaths(toRemove); } } From 4a2a1c2978bf5fc84830cbfaffc4a2ab5c7127ec Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 8 May 2023 09:48:36 +0200 Subject: [PATCH 04/13] FakeVim: Fix build with Qt 6.6 The connect doesn't work with incomplete type FakeVimHandler::Private anymore, so move the code. Change-Id: I686cd19a985f965cebf7d0a927cff4dc80ae746d Reviewed-by: hjk (cherry picked from commit e56e3b6f374e00179eb0537198437864dddc47f2) --- src/plugins/fakevim/fakevimhandler.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 68239650654..23a52793e88 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -1042,14 +1042,6 @@ inline QString msgMarkNotSet(const QString &text) return Tr::tr("Mark \"%1\" not set.").arg(text); } -static void initSingleShotTimer(QTimer *timer, int interval, FakeVimHandler::Private *receiver, - void (FakeVimHandler::Private::*slot)()) -{ - timer->setSingleShot(true); - timer->setInterval(interval); - QObject::connect(timer, &QTimer::timeout, receiver, slot); -} - class Input { public: @@ -2409,6 +2401,16 @@ public: FakeVimSettings &s = *fakeVimSettings(); }; +static void initSingleShotTimer(QTimer *timer, + int interval, + FakeVimHandler::Private *receiver, + void (FakeVimHandler::Private::*slot)()) +{ + timer->setSingleShot(true); + timer->setInterval(interval); + QObject::connect(timer, &QTimer::timeout, receiver, slot); +} + FakeVimHandler::Private::GlobalData FakeVimHandler::Private::g; FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget) From a8f288fc9e752f34e8e3b732ced758074060c52d Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 8 May 2023 14:28:20 +0200 Subject: [PATCH 05/13] CMakePM: Store CMake Autorun state for all tools Amends 2f39b51bdc1f73e2d87cc641a8501fd04ee76b4f The default tool's value is taken as default global value, then will be saved for all tools. This fixes the case when the false Autorun value for the default CMake tool would always be set as global autorun with no option to actually set global Autorun value due to the "upgrade" path mechanism. Change-Id: I17076bc0c77b087c5d4048fdfe74ddf91d837fd4 Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot --- src/plugins/cmakeprojectmanager/cmaketool.h | 2 ++ src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp | 1 + .../cmakeprojectmanager/cmaketoolsettingsaccessor.cpp | 8 +++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 42fa7b8f62d..54628910cc1 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -61,6 +61,8 @@ public: Utils::Id id() const { return m_id; } QVariantMap toMap () const; + void setAutorun(bool autoRun) { m_isAutoRun = autoRun; } + void setFilePath(const Utils::FilePath &executable); Utils::FilePath filePath() const; Utils::FilePath cmakeExecutable() const; diff --git a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp index 8bc396ced1a..7e4c777317d 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp @@ -141,6 +141,7 @@ void CMakeToolManager::restoreCMakeTools() emit m_instance->cmakeToolsLoaded(); // Store the default CMake tool "Autorun CMake" value globally + // TODO: Remove in Qt Creator 13 auto settings = Internal::CMakeSpecificSettings::instance(); if (settings->autorunCMake.value() == settings->autorunCMake.defaultValue()) { CMakeTool *cmake = defaultCMakeTool(); diff --git a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp index 43f1915709f..cfce81f005f 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp @@ -4,6 +4,7 @@ #include "cmaketoolsettingsaccessor.h" #include "cmakeprojectmanagertr.h" +#include "cmakespecificsettings.h" #include "cmaketool.h" #include @@ -185,9 +186,14 @@ void CMakeToolSettingsAccessor::saveCMakeTools(const QList &cmakeTo data.insert(QLatin1String(CMAKE_TOOL_DEFAULT_KEY), defaultId.toSetting()); int count = 0; - for (const CMakeTool *item : cmakeTools) { + for (CMakeTool *item : cmakeTools) { Utils::FilePath fi = item->cmakeExecutable(); + // Gobal Autorun value will be set for all tools + // TODO: Remove in Qt Creator 13 + const auto settings = CMakeSpecificSettings::instance(); + item->setAutorun(settings->autorunCMake.value()); + if (fi.needsDevice() || fi.isExecutableFile()) { // be graceful for device related stuff QVariantMap tmp = item->toMap(); if (tmp.isEmpty()) From a32e72069244046702745ebab572e02b0f8f9cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 5 May 2023 13:13:51 +0200 Subject: [PATCH 06/13] SquishTests: Some more Python3 adaption Change-Id: Iee0fd4107c3423d72a1dc51b0087837e4de46537 Reviewed-by: Reviewed-by: Christian Stenger --- tests/system/suite_HELP/tst_HELP02/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py index 3601c81a37b..7cacdf6e515 100644 --- a/tests/system/suite_HELP/tst_HELP02/test.py +++ b/tests/system/suite_HELP/tst_HELP02/test.py @@ -36,7 +36,7 @@ def checkQtCreatorHelpVersion(expectedVersion): helpContentWidget = waitForObject(':Qt Creator_QHelpContentWidget', 5000) waitFor("any(map(rightStart, dumpItems(helpContentWidget.model())))", 10000) items = dumpItems(helpContentWidget.model()) - test.compare(filter(rightStart, items)[0], + test.compare(list(filter(rightStart, items))[0], 'Qt Creator Manual %s' % expectedVersion, 'Verifying whether manual uses expected version.') except: From 13e0011dba24adff2454f89b4c8603d4ccf494f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 5 May 2023 16:45:35 +0200 Subject: [PATCH 07/13] SquishTests: Fix formatting of exception message Amends 8d03220017bf7e5c7be51fc36acb56fbde9e3e13 Change-Id: I05266fe6152a8ac2601890e8dcf32fc68d0989d3 Reviewed-by: Christian Stenger --- tests/system/shared/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 7b58b95c9f6..d05a3b37a8e 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -131,7 +131,7 @@ def __createProjectHandleQtQuickSelection__(minimumQtVersion): selectFromCombo(comboBox, minimumQtVersion) except: t,v = sys.exc_info()[:2] - test.fatal("Exception while trying to select Qt version", "%s :%s" % (t.__name__, str(v))) + test.fatal("Exception while trying to select Qt version", "%s: %s" % (t.__name__, str(v))) clickButton(waitForObject(":Next_QPushButton")) return minimumQtVersion From 8764bab6278aeefd8ecce71b0a700ce7e89b4a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 5 May 2023 13:28:32 +0200 Subject: [PATCH 08/13] SquishTests: Improve version detection for imports Change-Id: If38aa92c22c3390859f738ad5bfa5bacf47302ec Reviewed-by: Christian Stenger Reviewed-by: --- tests/system/shared/qtcreator.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 66407519066..d49b23350d7 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -12,10 +12,10 @@ import subprocess; import sys import errno; from datetime import datetime,timedelta; -try: - import __builtin__ # Python 2 -except ImportError: - import builtins as __builtin__ # Python 3 +if sys.version_info.major > 2: + import builtins as __builtin__ +else: + import __builtin__ srcPath = '' From 7d35a11fd4955f9191211e3f19b4737bbb0347ac Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 19 Apr 2023 10:17:48 +0200 Subject: [PATCH 09/13] QtVersionManager: Fix a warning about missing initializer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It fixes the following warning: warning: missing initializer for member ‘QtSupport::Internal::ExampleSetModel::ExtraExampleSet::qtVersion’ Amends bdfa412b14174e7e81b899ae8323fc78ddd7916e Change-Id: Ieb984664953f53d458297970e09678c499a26197 Reviewed-by: Eike Ziller (cherry picked from commit a5ad7221841e9fd2c358f1b2a43cfb0fc0c819b9) Reviewed-by: Jarek Kobus Reviewed-by: Qt CI Bot Reviewed-by: Marco Bubke --- src/plugins/qtsupport/exampleslistmodel.h | 2 +- src/plugins/qtsupport/qtversionmanager.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qtsupport/exampleslistmodel.h b/src/plugins/qtsupport/exampleslistmodel.h index c444f9bc1e7..f0465655b79 100644 --- a/src/plugins/qtsupport/exampleslistmodel.h +++ b/src/plugins/qtsupport/exampleslistmodel.h @@ -31,7 +31,7 @@ public: // qtVersion is set by recreateModel for extra sets that correspond to actual Qt versions. // This is needed for the decision to show categories or not based on the Qt version // (which is not ideal). - QVersionNumber qtVersion; + QVersionNumber qtVersion = {}; }; static QVector pluginRegisteredExampleSets(); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index bdf00c87d5a..c46a45c7636 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -5,7 +5,6 @@ #include "baseqtversion.h" #include "exampleslistmodel.h" -#include "qtkitinformation.h" #include "qtsupportconstants.h" #include "qtversionfactory.h" From 3f5d33fe5c2c8e5dfde6e8478102acde6b1b2e57 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 10 May 2023 15:17:03 +0200 Subject: [PATCH 10/13] CppEditor: Fix an error raised by Clang 16 error: integer value -1 is outside the valid range of values [0, 255] for this enumeration type [-Wenum-constexpr-conversion] Change-Id: I1b029099634dcc8f11071aad6a974ec0c41077ce Reviewed-by: Christian Kandeler --- src/plugins/cppeditor/cppquickfixes.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 3dae225cea3..4410ab60a8b 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -3697,6 +3697,7 @@ public: GenerateProperty = 1 << 5, GenerateConstantProperty = 1 << 6, HaveExistingQProperty = 1 << 7, + Invalid = -1, }; GenerateGetterSetterOp(const CppQuickFixInterface &interface, @@ -4394,7 +4395,7 @@ public: }; using Flag = GenerateGetterSetterOp::GenerateFlag; constexpr static Flag ColumnFlag[] = { - static_cast(-1), + Flag::Invalid, Flag::GenerateGetter, Flag::GenerateSetter, Flag::GenerateSignal, From 670d36a931cb094aedd6cf97ca4c9b09176e33f7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 26 Apr 2023 15:05:16 +0200 Subject: [PATCH 11/13] Doc: Don't mention qmake in Qt Quick debugging instructions The same field is available for both qmake and CMake projects. Use a screenshot from a CMake project. Also point to "Preferences > Build & Run > Default Build Properties" for globally enabling QML debugging and explain what "Use Project Default" and "Leave at Default" mean. Fixes: QTCREATORBUG-29089 Change-Id: I3d007d10ca3247dc387eaf21d4d4623d7e90167d Reviewed-by: Eike Ziller --- ...reator-build-settings-cmake-configure.webp | Bin 5270 -> 18528 bytes .../src/debugger/qtquick-debugging.qdoc | 63 +++++++++++++++--- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-build-settings-cmake-configure.webp b/doc/qtcreator/images/qtcreator-build-settings-cmake-configure.webp index 4b38b162f4cf840f41d73a2c6a9fe01fa0d4639a..0038dc4763198872c218fb790a32867118002328 100644 GIT binary patch literal 18528 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 L)R`1?@bdxyP$kj{ literal 5270 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 diff --git a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc index 833cbe69c47..c0246fc7b6f 100644 --- a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc +++ b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc @@ -38,22 +38,26 @@ The process of setting up debugging for Qt Quick projects depends on the \l{Creating Qt Quick Projects}{type of the project}: Qt Quick UI or Qt Quick Application, and the Qt version used. + + \section2 Debugging Qt Quick UI Projects \endif - To debug Qt Quick UI projects, select the \uicontrol {Enable QML} check box in the - \uicontrol {Debugger Settings} in \uicontrol Projects mode \uicontrol {Run Settings}. + To debug Qt Quick UI projects (.qmlproject), select the + \uicontrol {Enable QML} check box in \uicontrol {Debugger settings} + in \uicontrol Projects mode \uicontrol {Run Settings}. \if defined(qtcreator) + \section2 Debugging Qt Quick Applications + To debug Qt Quick Applications: \list 1 - \li If you use qmake as the build system, make sure that - debugging is enabled in the \uicontrol {Build Settings}, - \uicontrol {QML debugging and profiling} field, either - explicitly for the project or globally by default. + \li To create a build configuration that supports QML debugging, + select \uicontrol {Projects} > \uicontrol {Build} > + \uicontrol {QML debugging and profiling} > \uicontrol Enable. - \image qtcreator-projectpane.png "qmake general build settings pane" + \image qtcreator-build-settings-cmake-configure.webp {Build settings for a CMake project} \note Debugging requires opening a socket at a TCP port, which presents a security risk. Anyone on the Internet could connect @@ -61,9 +65,9 @@ functions. Therefore, you must make sure that the port is properly protected by a firewall. - \li In the \uicontrol {Run Settings}, \uicontrol {Debugger Settings} section, select - the \uicontrol {Enable QML} check box to enable - QML debugging. + \li In \uicontrol {Run Settings} > \uicontrol {Debugger settings}, select + the \uicontrol {Enable QML} check box to enable QML debugging for + running applications. \li Select \uicontrol Build > \uicontrol {Rebuild Project} to clean and rebuild the project. @@ -79,6 +83,43 @@ automatically installed during \QC and Qt installation. Do not delete them if you plan to debug QML applications. + \section2 Using Default Values + + You can enable or disable QML debugging globally in \uicontrol Edit > + \uicontrol Preferences > \uicontrol {Build & Run} > + \uicontrol {Default Build Properties}. + + \image qtcreator-build-settings-default.png "Default Build Properties tab in Build & Run Preferences" + + The value of the \uicontrol {QML debugging} field determines what happens + when creating new build configurations. The values \uicontrol Enable + and \uicontrol Disable explicitly set QML debugging for the new build + configuration to that value, regardless of what type of build + configuration you create. + + \uicontrol {Use Project Default} makes the values depend on the type of + build configuration: \uicontrol Debug, \uicontrol Profile, or + \uicontrol Release. When you use \l {CMake Build Configuration}{CMake} or + \l {qmake Build Configuration}{qmake} as a build system, debug and profile + build configurations have QML debugging enabled. However, release build + configurations do not include QML debugging because the debugging feature + makes applications vulnerable. + + The \uicontrol {Leave at Default} option in \uicontrol {Projects} > + \uicontrol {Build} > \uicontrol {QML debugging and profiling} is needed to keep existing, + already configured CMake build directories intact. Also, it + enables you to import an existing build into \QC without enforced changes, + so that you don't have to worry about a complete rebuild of the project, for + example. Even if you later change the configuration of the build outside of + \QC, it will be kept as you want it. + + There are some known issues in the interaction between the global setting + in \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} > + \uicontrol {Default Build Properties} and the build configuration. + For example, for qmake the global setting only affects build configurations + that are automatically created when enabling a kit. Also, CMake ignores the + global setting. + \section1 Mixed C++/QML Debugging To debug both the C++ and QML parts of your application at the same time, @@ -87,7 +128,7 @@ \uicontrol{Run Settings}. \endif - \image qtquick-debugging-settings.png + \image qtquick-debugging-settings.png {Debugger settings section in Run Settings} \section1 Starting QML Debugging From 2455ff28cd8b96d9fee329b47f8fc515e540198d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sch=C3=A4pers?= Date: Wed, 10 May 2023 21:40:53 +0200 Subject: [PATCH 12/13] Debugger: Fix defined but not used warning Move the currentError function where it is used. Change-Id: Iba669d677b35abc0c9291572c2ccb1df3cd2ed56 Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot --- src/plugins/debugger/terminal.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/terminal.cpp b/src/plugins/debugger/terminal.cpp index 6707137e853..5de7740380f 100644 --- a/src/plugins/debugger/terminal.cpp +++ b/src/plugins/debugger/terminal.cpp @@ -38,12 +38,6 @@ using namespace Utils; namespace Debugger::Internal { -static QString currentError() -{ - int err = errno; - return QString::fromLatin1(strerror(err)); -} - Terminal::Terminal(QObject *parent) : QObject(parent) { @@ -52,6 +46,10 @@ Terminal::Terminal(QObject *parent) void Terminal::setup() { #ifdef DEBUGGER_USE_TERMINAL + const auto currentError = [] { + int err = errno; + return QString::fromLatin1(strerror(err)); + }; if (!qtcEnvironmentVariableIsSet("QTC_USE_PTY")) return; From 7960c1f3f6481227986a09dbb20bbdead84bdc00 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Mon, 8 May 2023 11:00:04 +0200 Subject: [PATCH 13/13] ClangFormat: Fix code style preferences are grayed out Code style preferences are grayed out even when formatting mode is set to disable. Fixes: QTCREATORBUG-29129 Change-Id: Icf82fa0751f9291122c2af55111b6bd5fac85c7b Reviewed-by: Christian Kandeler --- .../clangformat/clangformatconfigwidget.cpp | 8 ++--- .../clangformatglobalconfigwidget.cpp | 30 ++++++++++++------- .../clangformatglobalconfigwidget.h | 3 ++ src/plugins/clangformat/clangformatutils.cpp | 12 +++++--- .../cppeditor/cppcodestylesettingspage.cpp | 3 +- .../texteditor/icodestylepreferences.cpp | 11 +++++++ .../texteditor/icodestylepreferences.h | 3 ++ 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 12e02b4fa74..dc5d1b3dc05 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -89,8 +89,8 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc d->checksScrollArea->setWidget(d->checksWidget); d->checksScrollArea->setWidgetResizable(true); - d->checksWidget->setEnabled(!codeStyle->isReadOnly() - && !codeStyle->isTemporarilyReadOnly()); + d->checksWidget->setEnabled(!codeStyle->isReadOnly() && !codeStyle->isTemporarilyReadOnly() + && !codeStyle->isAdditionalTabDisabled()); FilePath fileName; if (d->project) @@ -141,8 +141,8 @@ void ClangFormatConfigWidget::slotCodeStyleChanged( d->config->setIsReadOnly(codeStyle->isReadOnly()); d->style = d->config->style(); - d->checksWidget->setEnabled(!codeStyle->isReadOnly() - && !codeStyle->isTemporarilyReadOnly()); + d->checksWidget->setEnabled(!codeStyle->isReadOnly() && !codeStyle->isTemporarilyReadOnly() + && !codeStyle->isAdditionalTabDisabled()); fillTable(); updatePreview(); diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp index a0344e14eda..1f810c968cd 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp @@ -153,9 +153,20 @@ void ClangFormatGlobalConfigWidget::initOverrideCheckBox() "can be overridden by the settings below.")); } - auto setEnableOverrideCheckBox = [this](int index) { + auto setTemporarilyReadOnly = [this]() { + if (m_ignoreChanges.isLocked()) + return; + Utils::GuardLocker locker(m_ignoreChanges); + m_codeStyle->currentPreferences()->setTemporarilyReadOnly(!m_overrideDefault->isChecked()); + m_codeStyle->currentPreferences()->setIsAdditionalTabDisabled(!m_overrideDefault->isEnabled()); + ClangFormatSettings::instance().write(); + emit m_codeStyle->currentPreferencesChanged(m_codeStyle->currentPreferences()); + }; + + auto setEnableOverrideCheckBox = [this, setTemporarilyReadOnly](int index) { bool isDisable = index == static_cast(ClangFormatSettings::Mode::Disable); m_overrideDefault->setDisabled(isDisable); + setTemporarilyReadOnly(); }; setEnableOverrideCheckBox(m_indentingOrFormatting->currentIndex()); @@ -166,20 +177,19 @@ void ClangFormatGlobalConfigWidget::initOverrideCheckBox() Tr::tr("Override Clang Format configuration file with the chosen configuration.")); m_overrideDefault->setChecked(getProjectOverriddenSettings(m_project)); - m_codeStyle->currentPreferences()->setTemporarilyReadOnly(!m_overrideDefault->isChecked()); + setTemporarilyReadOnly(); - connect(m_overrideDefault, &QCheckBox::toggled, this, [this](bool checked) { + connect(m_overrideDefault, &QCheckBox::toggled, this, [this, setTemporarilyReadOnly](bool checked) { if (m_project) m_project->setNamedSettings(Constants::OVERRIDE_FILE_ID, checked); - else { - m_codeStyle->currentPreferences()->setTemporarilyReadOnly(!checked); - emit m_codeStyle->currentPreferencesChanged(m_codeStyle->currentPreferences()); - } + else + setTemporarilyReadOnly(); }); - connect(m_codeStyle, &TextEditor::ICodeStylePreferences::currentPreferencesChanged, this, [this] { - m_codeStyle->currentPreferences()->setTemporarilyReadOnly(!m_overrideDefault->isChecked()); - }); + connect(m_codeStyle, + &TextEditor::ICodeStylePreferences::currentPreferencesChanged, + this, + setTemporarilyReadOnly); } diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.h b/src/plugins/clangformat/clangformatglobalconfigwidget.h index 063c82852a3..962a7daaf17 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.h +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.h @@ -5,6 +5,8 @@ #include +#include + #include QT_BEGIN_NAMESPACE @@ -40,6 +42,7 @@ private: ProjectExplorer::Project *m_project; TextEditor::ICodeStylePreferences *m_codeStyle; + Utils::Guard m_ignoreChanges; QLabel *m_projectHasClangFormat; QLabel *m_formattingModeLabel; diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 120e27fde7b..a9f1a0d29b2 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -213,10 +213,14 @@ bool getCurrentOverriddenSettings(const Utils::FilePath &filePath) const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile( filePath); - return getProjectUseGlobalSettings(project) ? !TextEditor::TextEditorSettings::codeStyle("Cpp") - ->currentPreferences() - ->isTemporarilyReadOnly() - : getProjectOverriddenSettings(project); + return getProjectUseGlobalSettings(project) + ? !TextEditor::TextEditorSettings::codeStyle("Cpp") + ->currentPreferences() + ->isTemporarilyReadOnly() + && !TextEditor::TextEditorSettings::codeStyle("Cpp") + ->currentPreferences() + ->isAdditionalTabDisabled() + : getProjectOverriddenSettings(project); } ClangFormatSettings::Mode getProjectIndentationOrFormattingSettings( diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index ebb4a37485d..02adc539693 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -414,7 +414,8 @@ void CppCodeStylePreferencesWidget::setCodeStyleSettings(const CppCodeStyleSetti void CppCodeStylePreferencesWidget::slotCurrentPreferencesChanged(ICodeStylePreferences *preferences, bool preview) { - const bool enable = !preferences->isReadOnly() && !preferences->isTemporarilyReadOnly(); + const bool enable = !preferences->isReadOnly() && (!preferences->isTemporarilyReadOnly() + || preferences->isAdditionalTabDisabled()); for (QWidget *widget : d->m_controllers) widget->setEnabled(enable); diff --git a/src/plugins/texteditor/icodestylepreferences.cpp b/src/plugins/texteditor/icodestylepreferences.cpp index 931714b71c5..29a524ebf68 100644 --- a/src/plugins/texteditor/icodestylepreferences.cpp +++ b/src/plugins/texteditor/icodestylepreferences.cpp @@ -25,6 +25,7 @@ public: QString m_displayName; bool m_readOnly = false; bool m_temporarilyReadOnly = false; + bool m_isAdditionalTabDisabled = false; QString m_settingsSuffix; }; @@ -82,6 +83,16 @@ bool ICodeStylePreferences::isTemporarilyReadOnly() const return d->m_temporarilyReadOnly; } +bool ICodeStylePreferences::isAdditionalTabDisabled() const +{ + return d->m_isAdditionalTabDisabled; +} + +void ICodeStylePreferences::setIsAdditionalTabDisabled(bool on) +{ + d->m_isAdditionalTabDisabled = on; +} + void ICodeStylePreferences::setTabSettings(const TabSettings &settings) { if (d->m_tabSettings == settings) diff --git a/src/plugins/texteditor/icodestylepreferences.h b/src/plugins/texteditor/icodestylepreferences.h index 1c363903445..7fd616d5604 100644 --- a/src/plugins/texteditor/icodestylepreferences.h +++ b/src/plugins/texteditor/icodestylepreferences.h @@ -40,6 +40,9 @@ public: bool isTemporarilyReadOnly() const; void setTemporarilyReadOnly(bool on); + bool isAdditionalTabDisabled() const; + void setIsAdditionalTabDisabled(bool on); + void setTabSettings(const TabSettings &settings); TabSettings tabSettings() const; TabSettings currentTabSettings() const;