diff --git a/dist/changelog/changes-13.0.1.md b/dist/changelog/changes-13.0.1.md new file mode 100644 index 00000000000..d13fa8475ef --- /dev/null +++ b/dist/changelog/changes-13.0.1.md @@ -0,0 +1,131 @@ +Qt Creator 13.0.1 +================= + +Qt Creator version 13.0.1 contains bug fixes. + +The most important changes are listed in this document. For a complete list of +changes, see the Git log for the Qt Creator sources that you can check out from +the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/v13.0.0..v13.0.1 + +General +------- + +* Fixed a crash when hiding tool tips + ([QTCREATORBUG-30738](https://bugreports.qt.io/browse/QTCREATORBUG-30738)) + +Help +---- + +* Examples Browser + * Fixed that two columns were shown for the wrong category + ([QTCREATORBUG-30634](https://bugreports.qt.io/browse/QTCREATORBUG-30634)) + * Fixed that the clear button was missing after typing in the filter input + +* Fixed links to QML properties + ([QTCREATORBUG-30625](https://bugreports.qt.io/browse/QTCREATORBUG-30625)) + +Editing +------- + +* Fixed that backspace could delete more than one whitespace in the middle of a line + ([QTCREATORBUG-30725](https://bugreports.qt.io/browse/QTCREATORBUG-30725)) + +### C++ + +* Fixed that completion was shown for number literals + ([QTCREATORBUG-30607](https://bugreports.qt.io/browse/QTCREATORBUG-30607)) +* Fixed that Flex and Bison files were opened in the C++ editor + ([QTCREATORBUG-30686](https://bugreports.qt.io/browse/QTCREATORBUG-30686)) + +### QML + +* Fixed a crash when creating a `Qt Quick Application` when the QML language server is enabled + ([QTCREATORBUG-30739](https://bugreports.qt.io/browse/QTCREATORBUG-30739)) + +### Models + +* Fixed a crash when selecting elements + ([QTCREATORBUG-30413](https://bugreports.qt.io/browse/QTCREATORBUG-30413)) + +Projects +-------- + +* Fixed that the text editor for environment changes showed a blinking cursor even when not focused + ([QTCREATORBUG-30640](https://bugreports.qt.io/browse/QTCREATORBUG-30640)) +* Fixed that the option `Start build processes with low priority` did not persist + ([QTCREATORBUG-30696](https://bugreports.qt.io/browse/QTCREATORBUG-30696)) + +### CMake + +* Fixed that `Add build library search path to PATH` missed paths to libraries that were built by + the project + ([QTCREATORBUG-30644](https://bugreports.qt.io/browse/QTCREATORBUG-30644)) +* Fixed the handling of `source_group` + ([QTCREATORBUG-30602](https://bugreports.qt.io/browse/QTCREATORBUG-30602), + [QTCREATORBUG-30620](https://bugreports.qt.io/browse/QTCREATORBUG-30620)) +* Fixed that renaming files did not adapt `set_source_file_properties` calls + ([QTCREATORBUG-30174](https://bugreports.qt.io/browse/QTCREATORBUG-30174)) +* Fixed a crash when combining presets + ([QTCREATORBUG-30755](https://bugreports.qt.io/browse/QTCREATORBUG-30755)) + +Debugging +--------- + +* Fixed a crash when enabling QML debugging + ([QTCREATORBUG-30706](https://bugreports.qt.io/browse/QTCREATORBUG-30706)) +* LLDB + * Fixed that `Additional Attach Commands` were not used + +Analyzer +-------- + +### Clang + +* Fixed the documentation link for `clang-tidy` checks + ([QTCREATORBUG-30658](https://bugreports.qt.io/browse/QTCREATORBUG-30658)) + +Terminal +-------- + +* Fixed the `TERM` environment variable, which broke the functioning of certain command line tools + ([QTCREATORBUG-30737](https://bugreports.qt.io/browse/QTCREATORBUG-30737)) + +Platforms +--------- + +### Android + +* Updated the command line tools that are installed with `Set Up SDK` +* Fixed that Qt ABI detection was wrong directly after `Set Up SDK` + ([QTCREATORBUG-30568](https://bugreports.qt.io/browse/QTCREATORBUG-30568)) + +### iOS + +* Fixed a crash when starting multiple applications in Simulators + ([QTCREATORBUG-30666](https://bugreports.qt.io/browse/QTCREATORBUG-30666)) + +### Remote Linux + +* Fixed that deployment could block Qt Creator until finished +* Fixed that it was not possible to change the device name + ([QTCREATORBUG-30622](https://bugreports.qt.io/browse/QTCREATORBUG-30622)) + +Credits for these changes go to: +-------------------------------- +Ahmad Samir +Alessandro Portale +BogDan Vatra +Christian Kandeler +Christian Stenger +Cristian Adam +David Faure +David Schulz +Eike Ziller +Jaroslaw Kobus +Jussi Witick +Leena Miettinen +Marcus Tillmanns +Robert Löhning diff --git a/doc/qtcreator/config/style/qt5-sidebar.html b/doc/qtcreator/config/style/qt5-sidebar.html index 327bd27a293..cf020e31ca0 100644 --- a/doc/qtcreator/config/style/qt5-sidebar.html +++ b/doc/qtcreator/config/style/qt5-sidebar.html @@ -51,6 +51,7 @@
  • Create Models and Diagrams
  • Debug
  • Design UIs
  • +
  • Develop for Devices
  • Edit Code
  • Manage Kits
  • Manage Projects
  • diff --git a/doc/qtcreator/images/qtcreator-mcu-kit.png b/doc/qtcreator/images/qtcreator-mcu-kit.png deleted file mode 100644 index c218ad647e8..00000000000 Binary files a/doc/qtcreator/images/qtcreator-mcu-kit.png and /dev/null differ diff --git a/doc/qtcreator/images/qtcreator-mcu-new-project.webp b/doc/qtcreator/images/qtcreator-mcu-new-project.webp new file mode 100644 index 00000000000..270907c08b6 Binary files /dev/null and b/doc/qtcreator/images/qtcreator-mcu-new-project.webp differ diff --git a/doc/qtcreator/images/qtcreator-mcu-options.png b/doc/qtcreator/images/qtcreator-mcu-options.png deleted file mode 100644 index a7234466e42..00000000000 Binary files a/doc/qtcreator/images/qtcreator-mcu-options.png and /dev/null differ diff --git a/doc/qtcreator/images/qtcreator-preferences-kits-mcu.webp b/doc/qtcreator/images/qtcreator-preferences-kits-mcu.webp new file mode 100644 index 00000000000..cf61f131ecc Binary files /dev/null and b/doc/qtcreator/images/qtcreator-preferences-kits-mcu.webp differ diff --git a/doc/qtcreator/images/qtcreator-preferences-mcu.webp b/doc/qtcreator/images/qtcreator-preferences-mcu.webp new file mode 100644 index 00000000000..83d6fd17e01 Binary files /dev/null and b/doc/qtcreator/images/qtcreator-preferences-mcu.webp differ diff --git a/doc/qtcreator/src/external-resources/external-resources.qdoc b/doc/qtcreator/src/external-resources/external-resources.qdoc index 5c2f4f22850..6c385180192 100644 --- a/doc/qtcreator/src/external-resources/external-resources.qdoc +++ b/doc/qtcreator/src/external-resources/external-resources.qdoc @@ -25,6 +25,10 @@ \externalpage https://doc.qt.io/QtForMCUs/qtul-supported-platforms.html \title \QMCU - Supported Target Platforms */ +/*! + \externalpage https://doc.qt.io/QtForMCUs/qtul-prerequisites.html + \title \QMCU - Prerequisites +*/ /*! \externalpage https://doc.qt.io/QtForMCUs/qtul-getting-started-renesas.html \title Getting Started on Renesas @@ -37,6 +41,10 @@ \externalpage https://doc.qt.io/QtForMCUs/qtul-getting-started-on-nxp.html \title Getting Started on NXP */ +/*! + \externalpage https://doc.qt.io/QtForMCUs/qtul-getting-started-on-infineon.html + \title Getting Started on Infineon +*/ /*! \externalpage https://doc.qt.io/QtForMCUs/qtul-getting-started-windows.html \title Getting Started on Windows diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index 395c09ad72e..307c436d224 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -80,6 +80,21 @@ \generatelist creator-how-to-design + \section1 Develop for Devices + + Install the toolchain for building applications for the targeted + embedded or mobile platform on the computer, and use \QOI to + install Qt libraries that are built for the platform. Then add a + kit with the toolchain and the Qt version for the device's architecture. + When possible, \QOI creates suitable kits for you. + + \section2 MCUs + + Install \l {Qt for MCUs} and connect devices to the computer to run and + debug applications on them. + + \generatelist creator-how-to-mcu + \section1 Edit Code The code editor offers useful features for editing C++ and QML code, such diff --git a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc index 1b4051121f7..a6ca31f33fe 100644 --- a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc +++ b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc @@ -85,7 +85,7 @@ \list \li \l{Connecting MCUs} - \li \l{Running Applications on MCUs} + \li \l{MCUs}{How To: Develop for MCUs} \li \l{https://doc.qt.io/QtForMCUs/index.html}{\QMCU} \endlist @@ -107,5 +107,5 @@ \li \l{Qt for QNX} \endlist - \sa {Supported Platforms} + \sa {Develop for Devices}{How To: Develop for Devices}, {Supported Platforms} */ diff --git a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc index 65fba314e28..5d5dc8b956c 100644 --- a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc +++ b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc @@ -1,31 +1,29 @@ -// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-developing-ios.html \page creator-developing-mcu.html - \nextpage creator-developing-qnx.html + \previouspage creator-reference.html - \title Connecting MCUs + \ingroup creator-reference-devices - \QMCU enables you to use subsets of QML and Qt Quick Controls - to create user interfaces for devices that are powered by microcontroller - units (MCU). It includes a new graphics rendering engine that has a low - memory footprint and is optimized for MCUs and other resource-constrained - devices. + \title Developing for MCUs - You can connect MCU boards to a development host to build applications for - them using the GNU Arm Embedded GCC compiler, libraries, and other GNU tools - necessary for bare metal software development on devices based on the Arm - Cortex-M processors. You can deploy the applications on MCUs to run and - debug them using \QC. + \brief Connect MCU devices to the computer to run and debug applications on + them. - The toolchains are available for cross-compilation on Microsoft Windows, - Linux, and macOS. However, the Qt for \QMCU SDK is currently only available - for Windows and Linux. + \note Enable the McuSupport plugin to develop for MCUs. - For a list of \QMCU reference implementations, see the - \l{\QMCU - Supported Target Platforms}{\QMCU} documentation. + Use subsets of QML and Qt Quick Controls to create user interfaces for + devices that are powered by microcontroller units (MCU). \QMCU has a + new graphics rendering engine with a low memory footprint and optimization + for MCUs and other resource-constrained devices. + + Connect MCU boards to a computer to build applications for them. Deploy the + applications on MCUs to run and debug them. + + For a list of \QMCU reference implementations, see + \l{\QMCU - Supported Target Platforms}. \section1 Requirements @@ -33,157 +31,46 @@ \list \li \QMCU SDK (only available for Windows and Linux) - \li \l{https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm} - {GNU ARM Embedded Toolchain} + \li \l {\QMCU - Prerequisites}{Suitable toolchain} \endlist + The toolchains are available for cross-compilation on Microsoft Windows, + Linux, and macOS. However, the Qt for \QMCU SDK is currently only available + for Windows and Linux. + The hardware-specific requirements vary depending on the hardware platform you are developing for. For more information see: \list \li \l{Getting Started on NXP} \li \l{Getting Started on STM} \li \l{Getting Started on Renesas} + \li \l{Getting Started on Infineon} \endlist - \section1 Setting Up the Development Environment + \section1 \QMCU SDKs - You must download and install the required software and create connections - between \QC and MCUs. The following subsections guide you through the - setup process. - - \section2 MCU Plugin - - To be able to develop applications for MCUs, you need the MCU plugin. - This plugin is enabled automatically by \QOI when you - install \QMCU. - - \section2 Specifying MCU Settings - - To configure a connection between \QC and your MCU board, select - \preferences > \uicontrol Devices > \uicontrol MCU: - - \image qtcreator-mcu-options.png "MCU preferences" - - \list 1 - \li In the \uicontrol {\QMCU SDK} field, specify the path - to the directory where you installed \QMCU SDK. - \li In the \uicontrol {Targets supported by the \QMCU SDK} - field, select your MCU board. - \li In the \uicontrol Requirements section, ensure that the - platform-specific requirements are met. This varies depending - on the target chosen: - \list - \li For STM32 targets: - \list - \li The \uicontrol {GNU ARM Embedded Toolchain} or - \uicontrol {IAR ARM Compiler} path. - \li The \uicontrol {STM32CubeProgrammer} install path. - \li The \uicontrol {MCU SDK} for the chosen target. - \li The \uicontrol {FreeRTOS Sources} for the chosen target. - \endlist - \li For NXP targets: - \list - \li The \uicontrol {GNU ARM Embedded Toolchain} or - \uicontrol {IAR ARM Compiler} path. - \li The \uicontrol {MCUXpresso IDE} install path. - \li The \uicontrol {MCU SDK} for the chosen target. - \li The \uicontrol {FreeRTOS Sources} for the chosen target. - \endlist - \li For Renesas targets: - \list - \li The \uicontrol {Green Hills Compiler} path. - \li The \uicontrol {Renesas Graphics Library} path. - \endlist - \endlist - \li Select the - \uicontrol {Automatically create kits for all available targets on start} - option to create kits automatically the next time Qt Creator is - started. - \note You could also use \uicontrol {Create Kit} to manually - create kits for the chosen target. - \li Select \uicontrol Apply to save the settings. - \endlist - - \note When updating to other versions of the \QMCU SDK, \QC will - ask you if you want to replace the existing kits, or create new ones - alongside. This can also be done manually, for each individual target, - via \uicontrol {Update Kit} and \uicontrol {Create Kit}, respectively. - - \section2 Adding MCU Devices - - \note This optional step is not necessary if you have already - set up the MCU SDK as outlined in \l{Specifying MCU Settings}. - - \QC automatically adds a default MCU device when you select - \uicontrol Apply in the \uicontrol MCU tab after configuring the - MCU tool chain. - - \image qtcreator-mcu-device.png "MCU devices" - - To add MCU devices, select \preferences > \uicontrol Devices > \uicontrol Add - > \uicontrol {MCU Device} > \uicontrol {Start Wizard}: - - \list 1 - \li In the \uicontrol Name field, give the device a name. - \li In the \uicontrol Type field, select the board type. - \li Select \uicontrol Apply to add the device. - \endlist - - \section2 Managing MCU Kits - - \QC automatically adds kits for all the available targets, if the - \uicontrol {Automatically create kits for all available targets on start} - option is enabled under the \uicontrol MCU settings tab. You can also - create kits for individual targets manually, as outlined - in \l{Specifying MCU Settings}. - - \image qtcreator-mcu-kit.png "MCU kits" - - You can edit and/or remove individual kits in \preferences > \uicontrol Kits. - - However, for adding new kits you should use the \uicontrol {Create Kit} - button in the {\QMCU} settings tab. This method adds the paths to - the kit's toolkits and SDKs, and keeps them synchronized when selecting - \uicontrol Apply or \uicontrol OK. - - The \uicontrol {MCU dependencies} field displays paths to 3rd party - software required for MCU development with the current kit. - - \section1 Running Applications on MCUs - - You can use a wizard to set up a project for developing an application that - you can run on MCUs. The project uses a subset of QML and Qt Quick Controls - that are supported by \QMCU. For more information about developing - applications for MCUs, see the \QMCU documentation. - - To create an application and run it on a MCU board: - - \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol {Application (\QMCU)} > - \uicontrol {MCU Support Application} > \uicontrol Choose. - \li Follow the instructions of the wizard to create the project. - \li Select \uicontrol Projects > \uicontrol {Build & Run}, and then - select the kit for building the application and running it on the - MCU board specified in the kit. - \li Select \uicontrol Run to specify run settings. - Usually, you can use the default settings. - \endlist - - \section1 Supported \QMCU SDKs - - \note The \QMCU SDK 2.3 requires \QC 9.0.0, or later. - - The following table lists the \QC versions you can use to develop - applications with particular \QMCU SDK versions. + While you can use the latest \QC version to develop with any \QMCU SDK, the + following combinations have been tested to work well. \table \header \li \QC version \li \QMCU SDK version \row - \li 9.0.0 or later - \li 2.0 or later + \li 12.0.2 or later + \li 2.7 or later + \row + \li 11.0.3 + \li 2.6 + \row + \li 10.0.2 + \li 2.5 + \row + \li 10.0.0 + \li 2.4 + \row + \li 9.0.0 + \li 2.3 \row \li 7.0.0 up to 8.0.2 \li 2.0 up to 2.2 @@ -203,4 +90,159 @@ \li 4.11.x \li 1.0 \endtable + + \sa {Enable and disable plugins}, {MCUs}{How To: Develop for MCUs} +*/ + +/*! + \page creator-how-to-create-mcu-kits.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-mcu + + \title Connect MCU devices + + \note Enable the McuSupport plugin to develop for MCUs. + + To configure a connection between \QC and your MCU board: + + \list 1 + \li Go to \preferences > \uicontrol Devices > \uicontrol MCU. + \li In \uicontrol {\QMCU SDK}, specify the path to the directory where + you installed \QMCU SDK. + \image qtcreator-preferences-mcu.webp {MCU preferences} + \li In \uicontrol {Targets supported by the \QMCU SDK}, select your MCU + board. + \li In \uicontrol Requirements, check that the platform-specific + requirements are met. This depends on the target: + \list + \li For STM32 targets: + \list + \li The \uicontrol {GNU ARM Embedded Toolchain} or + \uicontrol {IAR ARM Compiler} path. + \li The \uicontrol {STM32CubeProgrammer} install path. + \li The \uicontrol {Board SDK} for the chosen target. + \li The \uicontrol {FreeRTOS Sources} for the chosen target. + \endlist + \li For NXP targets: + \list + \li The \uicontrol {GNU ARM Embedded Toolchain} or + \uicontrol {IAR ARM Compiler} path. + \li The \uicontrol {MCUXpresso IDE} install path. + \li The \uicontrol {Board SDK} for the chosen target. + \li The \uicontrol {FreeRTOS Sources} for the chosen target. + \endlist + \li For Renesas targets: + \list + \li The \uicontrol {Green Hills Compiler} path. + \li The \uicontrol {Renesas Graphics Library} path. + \endlist + \li For Infineon targets: + \list + \li The \uicontrol {Green Hills Compiler for ARM} path. + \li The \uicontrol {Graphics Driver for Traveo II Cluster Series} + path. + \li The \uicontrol {Infineon Auto Flash Utility} path. + \endlist + \endlist + \li Select + \uicontrol {Automatically create kits for all available targets on start} + to create kits automatically the next time \QC starts. + \note Select \uicontrol {Create Kit} to manually create kits for the + target. + \li Select \uicontrol Apply to save the preferences. + \endlist + + \section1 Add MCU devices + + \QC automatically adds a default MCU device when you select + \uicontrol Apply in the \uicontrol MCU tab after configuring the + MCU tool chain. + + \image qtcreator-mcu-device.png {MCU devices} + + To add MCU devices, select \preferences > \uicontrol Devices > \uicontrol Add + > \uicontrol {MCU Device} > \uicontrol {Start Wizard}: + + \list 1 + \li In \uicontrol Name, give the device a name. + \li In \uicontrol Type, select the board type. + \li Select \uicontrol Apply to add the device. + \endlist + + \sa {Enable and disable plugins}, {MCUs}{How To: Develop for MCUs}, + {Developing for MCUs} +*/ + + +/*! + \page creator-how-to-manage-mcu-kits.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-mcu + + \title Manage MCU Kits + + \note Enable the McuSupport plugin to develop for MCUs. + + \QC automatically adds kits for all the available MCU targets if you select + \uicontrol {Automatically create kits for all available targets on start} + in \preferences > \uicontrol Devices > \uicontrol MCU. + + \image qtcreator-preferences-kits-mcu.webp {MCU kit} + + \note When you update the \QMCU SDK, \QC asks you whether you want to replace + the existing kits or create additional kits. To do this manually for each + target, select \uicontrol {Update Kit} or \uicontrol {Create Kit}. + + To add new kits, go to \preferences > \uicontrol Devices > \uicontrol MCU, + and select \uicontrol {Create Kit}. This adds the paths to the kit's toolkits + and SDKs, and keeps them synchronized when you select \uicontrol Apply or + \uicontrol OK. + + \section1 Change or remove MCU kits + + To change or remove individual kits, go to \preferences > \uicontrol Kits. + + The \uicontrol {MCU dependencies} field displays paths to 3rd party + software required for MCU development with the current kit. + + \sa {Enable and disable plugins}, {MCUs}{How To: Develop for MCUs}, + {Developing for MCUs} +*/ + +/*! + \page creator-how-to-run-on-mcu-devices.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-mcu + + \title Create MCU projects + + \note Enable the McuSupport plugin to develop for MCUs. + + Create a project for developing an application that you can run on MCUs. + The project imports a subset of QML and Qt Quick Controls types + that are supported by \QMCU. For more information about developing + applications for MCUs, see \l {Qt for MCUs}. + + To create an application and run it on a MCU board: + + \list 1 + \li Go to \uicontrol File > \uicontrol {New Project}. + \image qtcreator-mcu-new-project.webp {New Project dialog} + \li Select \uicontrol {QmlProject Application (\QMCU)} > + \uicontrol {Qt for MCUs Empty Application} or + \uicontrol {Qt for MCUs Example Application} > \uicontrol Choose. + \li Follow the instructions of the wizard to create the project. + \li Select \uicontrol Projects > \uicontrol {Build & Run}, and then + select the kit for building the application and running it on the + MCU board specified in the kit. + \li Select \uicontrol Run to specify run settings. + Usually, you can use the default settings. + \endlist + + \sa {Configure projects for running}, {Enable and disable plugins}, + {MCUs}{How To: Develop for MCUs}, {Use project wizards}, + {Developing for MCUs} */ diff --git a/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc b/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc index fc33900659b..395a5ba4589 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc @@ -61,7 +61,7 @@ \QC detects the tools and configured devices automatically and uses the tools to build, deploy, and run applications. - \li \l{Connecting MCUs} + \li \l{Developing for MCUs} You can connect MCU boards to a development host to deploy, run, and debug applications on them from \QC. diff --git a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc index 45432f561bd..86450b31b13 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc @@ -36,6 +36,15 @@ \annotatedlist creator-reference-build-configurations + \section1 Devices + + Connect devices to the computer to run, debug, and analyze applications + built for them from \QC. When you install Qt for a target platform, such + as Android or QNX, the build and run configurations for the development + targets might be set up automatically in \QC. + + \annotatedlist creator-reference-devices + \section1 Editors When you open files, \QC chooses a suitable editor according to the file diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 0a60027451d..4c6f0c4cb57 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -42,7 +42,6 @@ \li \l{Connecting Boot2Qt Devices} \li \l{Adding Docker Devices} \li \l{Connecting iOS Devices} - \li \l{Connecting MCUs} \li \l{Connecting QNX Devices} \li \l{Connecting Remote Linux Devices} \li \l{Building Applications for the Web} @@ -109,6 +108,11 @@ \generatelist creator-how-to-debug \li Design UIs \generatelist creator-how-to-design + \li Develop for Devices + \list + \li MCUs + \generatelist creator-how-to-mcu + \endlist \li Edit Code \generatelist creator-how-to-edit \list @@ -148,6 +152,10 @@ \list \li Build Configurations \generatelist creator-reference-build-configurations + \endlist + \li Devices + \generatelist creator-reference-devices + \list \li Run Configurations \generatelist creator-reference-run-configurations \endlist diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 7809a6a3dcb..f2387ac913c 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1456,6 +1456,21 @@ class Dumper(DumperBase): if bp is not None: self.reportBreakpointUpdate(bp) + def wantAutoContinue(self, frame): + if self.platform_ != 'remote-android': + return False + funcname = frame.GetFunctionName() + if funcname and funcname.startswith('java.'): + return True + module = frame.GetModule() + filespec = module.GetPlatformFileSpec() # Not GetFileSpec + filename = filespec.GetFilename() + if filename == 'libart.so': + return True + if funcname == None and not frame.line_entry.file.IsValid() and filename == None: + return True + return False + def handleEvent(self, event): if lldb.SBBreakpoint.EventIsBreakpointEvent(event): self.handleBreakpointEvent(event) @@ -1490,8 +1505,12 @@ class Dumper(DumperBase): if state == lldb.eStateStopped: stoppedThread = self.firstStoppedThread() if stoppedThread: - #self.report("STOPPED THREAD: %s" % stoppedThread) frame = stoppedThread.GetFrameAtIndex(0) + if self.wantAutoContinue(frame): + #self.warn("AUTO CONTINUE") + error = self.process.Continue() + return + #self.report("FRAME: %s" % frame) function = frame.GetFunction() functionName = function.GetName() diff --git a/share/qtcreator/themes/dark.figmatokens b/share/qtcreator/themes/dark.figmatokens index 8937a3cc2d7..194ce7fab25 100644 --- a/share/qtcreator/themes/dark.figmatokens +++ b/share/qtcreator/themes/dark.figmatokens @@ -20,7 +20,13 @@ Token_Foreground_Subtle=ff2A2A2A Token_Text_Default=ffF8F8F8 Token_Text_Muted=ffAEAEAE Token_Text_Subtle=ff595959 -Token_Text_Accent=ff23B26A + +; Token_Text_Accent value from Figma is still too dark. Therefore, it is modified, here. +; Text (consisting of thin lines) needs to be substantially brighter than accent colors used for +; larger-area elements like the filled button. + +; Token_Text_Accent=ff23B26A +Token_Text_Accent=ff30C06A Token_Stroke_Strong=ffeeeeee Token_Stroke_Muted=ff727272 diff --git a/share/qtcreator/themes/light.figmatokens b/share/qtcreator/themes/light.figmatokens index 6ef243d17da..138ad74afdf 100644 --- a/share/qtcreator/themes/light.figmatokens +++ b/share/qtcreator/themes/light.figmatokens @@ -10,7 +10,12 @@ Token_Accent_Muted=ff1f9b5d Token_Accent_Subtle=ff1a8550 Token_Background_Default=fffcfcfc -Token_Background_Muted=ffF2F2F2 + +; Token_Background_Muted value from Figma is too dark to ensure proper contrast when used as +; text bachground. Therefore, it is modified, here. + +;Token_Background_Muted=ffF2F2F2 +Token_Background_Muted=ffF6F6F6 Token_Background_Subtle=ffe7e7e7 Token_Foreground_Default=ffD8D8D8 @@ -20,7 +25,7 @@ Token_Foreground_Subtle=ffEFEFEF Token_Text_Default=ff393939 Token_Text_Muted=ff6a6a6a Token_Text_Subtle=ffbebebe -Token_Text_Accent=ff28C878 +Token_Text_Accent=ff1F9B5D Token_Stroke_Strong=ff464646 Token_Stroke_Muted=ff727272 diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index a2998e2f07d..b3649a457d1 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -197,7 +197,8 @@ FileSaver::FileSaver(const FilePath &filePath, QIODevice::OpenMode mode) m_file.reset(tf); } else { const bool readOnlyOrAppend = mode & (QIODevice::ReadOnly | QIODevice::Append); - m_isSafe = !readOnlyOrAppend && !filePath.hasHardLinks(); + m_isSafe = !readOnlyOrAppend && !filePath.hasHardLinks() + && !qtcEnvironmentVariableIsSet("QTC_DISABLE_ATOMICSAVE"); if (m_isSafe) m_file.reset(new SaveFile(filePath)); else diff --git a/src/libs/utils/reloadpromptutils.cpp b/src/libs/utils/reloadpromptutils.cpp index 52571382454..8a07592d3fe 100644 --- a/src/libs/utils/reloadpromptutils.cpp +++ b/src/libs/utils/reloadpromptutils.cpp @@ -89,12 +89,10 @@ QTCREATOR_UTILS_EXPORT FileDeletedPromptAnswer "Do you want to save it under a different name, or close " "the editor?").arg(QDir::toNativeSeparators(fileName)); QMessageBox box(QMessageBox::Question, title, msg, QMessageBox::NoButton, parent); - QPushButton *close = - box.addButton(Tr::tr("&Close"), QMessageBox::RejectRole); + QPushButton *saveas = box.addButton(Tr::tr("Save &as..."), QMessageBox::ActionRole); + QPushButton *close = box.addButton(Tr::tr("&Close"), QMessageBox::RejectRole); QPushButton *closeAll = box.addButton(Tr::tr("C&lose All"), QMessageBox::RejectRole); - QPushButton *saveas = - box.addButton(Tr::tr("Save &as..."), QMessageBox::ActionRole); QPushButton *save = box.addButton(Tr::tr("&Save"), QMessageBox::AcceptRole); box.setDefaultButton(saveas); diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 69b5e395565..07f526a4af0 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -1010,7 +1010,13 @@ QFont StyleHelper::uiFont(UiElement element) const qreal qrealPointSize = metrics.pixelSize * pixelsToPointSizeFactor; font.setPointSizeF(qrealPointSize); - font.setWeight(metrics.weight); + // Intermediate font weights can produce blurry rendering and are harder to read. + // For "non-retina" screens, apply the weight only for some fonts. + static const bool isHighDpi = qApp->devicePixelRatio() >= 2; + const bool setWeight = isHighDpi || element == UiElementCaptionStrong + || element <= UiElementH4; + if (setWeight) + font.setWeight(metrics.weight); return font; } diff --git a/src/libs/utils/tooltip/tooltip.cpp b/src/libs/utils/tooltip/tooltip.cpp index 93f4c1d2ff0..da11540c083 100644 --- a/src/libs/utils/tooltip/tooltip.cpp +++ b/src/libs/utils/tooltip/tooltip.cpp @@ -288,9 +288,11 @@ void ToolTip::hideTipWithDelay() void ToolTip::hideTipImmediately() { if (m_tip) { - m_tip->close(); - m_tip->deleteLater(); - m_tip = nullptr; + TipLabel *tip = m_tip.data(); + m_tip.clear(); + + tip->close(); + tip->deleteLater(); } m_showTimer.stop(); m_hideDelayTimer.stop(); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 24fa0875c47..2dbad6c162b 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -254,7 +254,7 @@ static expected_str testJavaC(const FilePath &jdkPath) jdkVersion = QVersionNumber::fromString(stdOut.mid(outputPrefix.length()).split('\n').first()); - if (jdkVersion.isNull() || jdkVersion.majorVersion() != requiredJavaMajorVersion) { + if (jdkVersion.isNull() /* || jdkVersion.majorVersion() != requiredJavaMajorVersion */ ) { return make_unexpected(Tr::tr("Unsupported JDK version (needs to be %1): %2 (parsed: %3)") .arg(requiredJavaMajorVersion) .arg(stdOut) @@ -813,6 +813,7 @@ void AndroidSettingsWidget::updateUI() } } + m_makeDefaultNdkButton->setEnabled(m_ndkListWidget->count() > 0); m_makeDefaultNdkButton->setText(isDefaultNdkSelected() ? Tr::tr("Unset Default") : Tr::tr("Make Default")); } diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 1d5dc2730c3..b491bd293f1 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -65,7 +65,11 @@ static void adjustFormatStyleForLineBreak(clang::format::FormatStyle &style, static llvm::StringRef clearExtraNewline(llvm::StringRef text) { +#if LLVM_VERSION_MAJOR >= 16 + while (text.starts_with("\n\n")) +#else while (text.startswith("\n\n")) +#endif text = text.drop_front(); return text; } diff --git a/src/plugins/clangformat/llvmfilesystem.h b/src/plugins/clangformat/llvmfilesystem.h index fface01fc08..b2d1c5de7e7 100644 --- a/src/plugins/clangformat/llvmfilesystem.h +++ b/src/plugins/clangformat/llvmfilesystem.h @@ -127,7 +127,11 @@ public: /// Gets real path of \p Path e.g. collapse all . and .. patterns, resolve /// symlinks. For real file system, this uses `llvm::sys::fs::real_path`. /// This returns errc::operation_not_permitted if not implemented by subclass. - std::error_code getRealPath(const Twine &Path, SmallVectorImpl &Output) const override + std::error_code getRealPath(const Twine &Path, SmallVectorImpl &Output) +#if LLVM_VERSION_MAJOR < 19 + const +#endif + override { Q_UNUSED(Path); Q_UNUSED(Output); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 25d51488f8b..b2b042a2b0d 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1354,12 +1354,10 @@ void CMakeBuildSystem::updateProjectData() return QtMajorVersion::None; }; - QtMajorVersion qtVersion = kitInfo.projectPartQtVersion; - if (qtVersion == QtMajorVersion::None) - qtVersion = qtVersionFromCMake({{QtMajorVersion::Qt6, {"Qt6", "Qt6Core"}}, - {QtMajorVersion::Qt5, {"Qt5", "Qt5Core"}}, - {QtMajorVersion::Qt4, {"Qt4", "Qt4Core"}} - }); + QtMajorVersion qtVersion = qtVersionFromCMake( + {{QtMajorVersion::Qt6, {"Qt6", "Qt6Core"}}, + {QtMajorVersion::Qt5, {"Qt5", "Qt5Core"}}, + {QtMajorVersion::Qt4, {"Qt4", "Qt4Core"}}}); QString errorMessage; RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage); @@ -1368,7 +1366,7 @@ void CMakeBuildSystem::updateProjectData() qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage; for (RawProjectPart &rpp : rpps) { - rpp.setQtVersion(qtVersion); // TODO: Check if project actually uses Qt. + rpp.setQtVersion(qtVersion); const FilePath includeFileBaseDir = buildConfiguration()->buildDirectory(); QStringList cxxFlags = rpp.flagsForCxx.commandLineFlags; QStringList cFlags = rpp.flagsForC.commandLineFlags; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 23c68a6e642..9e119bba886 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -136,6 +136,8 @@ Internal::PresetsData CMakeProject::combinePresets(Internal::PresetsData &cmakeP && left.inherits.value().contains(right.name); const bool inheritsGreater = left.inherits && right.inherits + && !left.inherits.value().isEmpty() + && !right.inherits.value().isEmpty() && left.inherits.value().first() > right.inherits.value().first(); diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 6ec37a6cb8c..bd9b2620670 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1473,6 +1473,7 @@ bool EditorManagerPrivate::activateEditorForEntry(EditorView *view, DocumentMode void EditorManagerPrivate::closeEditorOrDocument(IEditor *editor) { QTC_ASSERT(editor, return); + EditorManager::addCurrentPositionToNavigationHistory(); QList visible = EditorManager::visibleEditors(); if (Utils::contains(visible, [&editor](IEditor *other) { @@ -2690,7 +2691,6 @@ void EditorManager::slotCloseCurrentEditorOrDocument() { if (!d->m_currentEditor) return; - addCurrentPositionToNavigationHistory(); d->closeEditorOrDocument(d->m_currentEditor); } diff --git a/src/plugins/coreplugin/fileutils.cpp b/src/plugins/coreplugin/fileutils.cpp index 5712c9c8b5b..f7c7d4a759c 100644 --- a/src/plugins/coreplugin/fileutils.cpp +++ b/src/plugins/coreplugin/fileutils.cpp @@ -32,10 +32,28 @@ #include #include +#ifdef Q_OS_WIN +#ifdef QTCREATOR_PCH_H +#define CALLBACK WINAPI +#endif +#include +#include +#endif + using namespace Utils; namespace Core { +static FilePath windowsDirectory() +{ +#ifdef Q_OS_WIN + wchar_t str[UNICODE_STRING_MAX_CHARS] = {}; + if (SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_WINDOWS, nullptr, 0, str))) + return FilePath::fromUserInput(QString::fromUtf16(reinterpret_cast(str))); +#endif + return {}; +} + // Show error with option to open settings. static void showGraphicalShellError(QWidget *parent, const QString &app, const QString &error) { @@ -56,13 +74,7 @@ void FileUtils::showInGraphicalShell(QWidget *parent, const FilePath &pathIn) const QFileInfo fileInfo = pathIn.toFileInfo(); // Mac, Windows support folder or file. if (HostOsInfo::isWindowsHost()) { - const FilePath explorer = FilePath("explorer.exe").searchInPath(); - if (explorer.isEmpty()) { - QMessageBox::warning(parent, - Tr::tr("Launching Windows Explorer Failed"), - Tr::tr("Could not find explorer.exe in path to launch Windows Explorer.")); - return; - } + const FilePath explorer = windowsDirectory().pathAppended("explorer.exe"); QStringList param; if (!pathIn.isDir()) param += QLatin1String("/select,"); diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index fe01944a6f2..c2b28c1f83e 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -287,7 +287,7 @@ static const QPixmap &searchBoxIcon() } SearchBox::SearchBox(QWidget *parent) - : QLineEdit(parent) + : Utils::FancyLineEdit(parent) { setAttribute(Qt::WA_MacShowFocusRect, false); setAutoFillBackground(false); @@ -301,10 +301,9 @@ SearchBox::SearchBox(QWidget *parent) pal.setColor(QPalette::Text, searchBoxTextTF.color()); setPalette(pal); - const QSize iconSize = searchBoxIcon().deviceIndependentSize().toSize(); - setContentsMargins({HPaddingXs, ExPaddingGapM, - HPaddingXs + iconSize.width() + HPaddingXs, ExPaddingGapM}); + setContentsMargins({HPaddingXs, ExPaddingGapM, 0, ExPaddingGapM}); setFixedHeight(ExPaddingGapM + searchBoxTextTF.lineHeight() + ExPaddingGapM); + setFiltering(true); } QSize SearchBox::minimumSizeHint() const @@ -351,10 +350,12 @@ void SearchBox::paintEvent(QPaintEvent *event) QPainter p(this); paintCommonBackground(&p, rect(), this); - const QPixmap icon = searchBoxIcon(); - const QSize iconS = icon.deviceIndependentSize().toSize(); - const QPoint iconPos(width() - HPaddingXs - iconS.width(), (height() - iconS.height()) / 2); - p.drawPixmap(iconPos, icon); + if (text().isEmpty()) { + const QPixmap icon = searchBoxIcon(); + const QSize iconS = icon.deviceIndependentSize().toSize(); + const QPoint iconPos(width() - HPaddingXs - iconS.width(), (height() - iconS.height()) / 2); + p.drawPixmap(iconPos, icon); + } QLineEdit::paintEvent(event); } diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index cce3b812527..c32e803029e 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -25,8 +25,6 @@ #include #include -namespace Utils { class FancyLineEdit; } - namespace Core { namespace WelcomePageHelpers { @@ -113,7 +111,7 @@ private: const Role m_role = Primary; }; -class CORE_EXPORT SearchBox : public QLineEdit +class CORE_EXPORT SearchBox : public Utils::FancyLineEdit { public: explicit SearchBox(QWidget *parent = nullptr); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 0e53afad359..3d21f82ca2e 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -30,6 +30,7 @@ #include +#include #include #include #include @@ -328,6 +329,16 @@ void LldbEngine::handleLldbStarted() runEngine(); }; runCommand(cmd3); + + // Execute post attach commands + QStringList commands = settings().gdbPostAttachCommands().split('\n'); + commands = Utils::filtered(commands, [](const QString line) { + const QString trimmed = line.trimmed(); + return !trimmed.isEmpty() && !trimmed.startsWith('#'); + }); + for (const QString &cmd : commands) { + executeDebuggerCommand(cmd); + } } else { notifyEngineSetupFailed(); } diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp index 0428fd6a844..3df7622548d 100644 --- a/src/plugins/languageclient/languageclientutils.cpp +++ b/src/plugins/languageclient/languageclientutils.cpp @@ -235,8 +235,8 @@ void updateEditorToolBar(Core::IEditor *editor) TextDocument *document = textEditor->textDocument(); Client *client = LanguageClientManager::clientForDocument(textEditor->textDocument()); - ClientExtras *extras = widget->findChild(clientExtrasName, - Qt::FindDirectChildrenOnly); + ClientExtras *extras = dynamic_cast( + widget->findChild(clientExtrasName, Qt::FindDirectChildrenOnly)); if (!extras) { if (!client) return; diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 29742256443..4928ae826e0 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -47,10 +47,9 @@ const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject"; namespace ProjectExplorer { namespace Internal { -constexpr TextFormat projectNameTF {Theme::Token_Text_Accent, StyleHelper::UiElementH6}; -constexpr TextFormat projectPathTF {Theme::Token_Text_Muted, StyleHelper::UiElementCaptionStrong}; -constexpr TextFormat sessionNameTF = {projectNameTF.themeColor, projectNameTF.uiElement, - Qt::AlignVCenter | Qt::TextDontClip}; +constexpr TextFormat projectNameTF {Theme::Token_Text_Accent, StyleHelper::UiElementH5}; +constexpr TextFormat projectPathTF {Theme::Token_Text_Muted, StyleHelper::UiElementH6}; +constexpr TextFormat sessionNameTF = projectNameTF; constexpr TextFormat sessionProjectNameTF {Theme::Token_Text_Default, projectNameTF.uiElement}; constexpr TextFormat shortcutNumberTF {Theme::Token_Text_Default, StyleHelper::UiElementCaptionStrong, @@ -59,7 +58,7 @@ constexpr TextFormat actionTF {Theme::Token_Text_Default, StyleHelper::UiElement Qt::AlignCenter | Qt::TextDontClip}; constexpr TextFormat actionDisabledTF {Theme::Token_Text_Subtle, actionTF.uiElement, actionTF.drawTextFlags}; -constexpr int shortcutNumberWidth = 16; +constexpr int shortcutNumberWidth = 6; constexpr int actionSepWidth = 1; constexpr int sessionScrollBarGap = HPaddingXs; @@ -316,36 +315,36 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final { - // visible on withIcon() Gap + arrow visible on hover Extra margin right of project item - // | | | - // +-----------+----------+ +--------+-------+ +----------+----------+ - // | | | | | | + // visible on withIcon() Gap + arrow visible on hover Extra margin right of project item + // | | | + // +----------+----------+ +--------+-------+ +----------+----------+ + // | | | | | | // - // +------------+--------+---------+------------+---------+-------------+--------+-------+------------+---------------------+ --+ - // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | | - // | | | +------------+ +-------------+ | | | | | - // |(HPaddingXs)||(HGapXxs)| |(HGapXxs)||(HGapXs)|| | | +-- Header - // | |(16x16) | +------------+ +-------------+ | | | | | - // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | | - // |------------+--------+---------+------------+---------+-------------+--------+-------+ | | --+ - // | +-- | (VPaddingXxs) | | | | - // | | +------------------------------+(HPaddingXs)| | | - // | | | | | | | - // | | +------------------------------+ | | | - // | Per project in session --+ | (ExPaddingGapS) | |(sessionScrollBarGap)| | - // | | +------------------------------+ | | | - // | | | | | | | - // | | +------------------------------+ | | +-- Expansion - // | +-- | (VPaddingXxs) | | | | - // +------------------------------------------------------+------------------------------+------------+ | | - // | (VPaddingXs) | | | - // +-----------------------------------------+--------------+-----------------------------------------+ | | - // +-- | || | | | - // | +-----------------------------------------+--------------+-----------------------------------------+ | | - // | | (VPaddingXs) | | | - // | +--------------------------------------------------------------------------------------------------+---------------------+ --+ - // | | (VGapL) | +-- Gap between session items - // | +------------------------------------------------------------------------------------------------------------------------+ --+ + // +------------+--------+--------+------------+--------+-------------+--------+-------+------------+---------------------+ --+ + // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | | + // | | | +------------+ +-------------+ | | | | | + // |(HPaddingXs)||(HGapXs)| |(HGapXs)||(HGapXs)|| | | +-- Header + // | |(w:6) | +------------+ +-------------+ | | | | | + // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | | + // |------------+--------+--------+------------+--------+-------------+--------+-------+ | | --+ + // | +-- | (VPaddingXxs) | | | | + // | | +------------------------------+(HPaddingXs)| | | + // | | | | | | | + // | | +------------------------------+ | | | + // | Per project in session --+ | (ExPaddingGapS) | |(sessionScrollBarGap)| | + // | | +------------------------------+ | | | + // | | | | | | | + // | | +------------------------------+ | | +-- Expansion + // | +-- | (VPaddingXxs) | | | | + // +----------------------------------------------------+------------------------------+------------+ | | + // | (VPaddingXs) | | | + // +---------------------------------------+--------------+-----------------------------------------+ | | + // +-- | || | | | + // | +---------------------------------------+--------------+-----------------------------------------+ | | + // | | (VPaddingXs) | | | + // | +------------------------------------------------------------------------------------------------+---------------------+ --+ + // | | (VGapL) | +-- Gap between session items + // | +----------------------------------------------------------------------------------------------------------------------+ --+ // | // \ session action "buttons" and dividers // +-----------------------------------------------+--------+---------+--------+ @@ -381,11 +380,11 @@ public: const int y = bgR.y(); const int numberX = x + s(HPaddingXs); - const int iconX = numberX + shortcutNumberWidth + s(HGapXxs); + const int iconX = numberX + shortcutNumberWidth + s(HGapXs); const int arrowX = bgR.right() - s(HPaddingXs) - arrowS.width(); const QRect arrowHoverR(arrowX - s(HGapXs) + 1, y, s(HGapXs) + arrowS.width() + s(HPaddingXs), hdR.height()); - const int textX = withIcon() ? iconX + iconS.width() + s(HGapXxs) : iconX; + const int textX = withIcon() ? iconX + iconS.width() + s(HGapXs) : iconX; const int iconY = y + (hdR.height() - iconS.height()) / 2; const int arrowY = y + (hdR.height() - arrowS.height()) / 2; @@ -622,24 +621,24 @@ class ProjectDelegate : public BaseDelegate public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final { - // visible on with Icon() Extra margin right of project item - // | | - // +--------+-------+ +------+-----+ - // | | | | + // visible on with Icon() Extra margin right of project item + // | | + // +--------+-------+ +------+-----+ + // | | | | // - // +------------+--------+---------+------+---------+-------------+------------+------------+ - // | | | | | | (VPaddingXs)| | | - // | | | | | +-------------+ | | - // | | | | | || | | - // | | | | | +-------------+ | | - // |(HPaddingXs)||(HGapXxs)||(HGapXxs)| (VGapXs) |(HPaddingXs)|(HPaddingXs)| - // | |(16x16) | | | +-------------+ | | - // | | | | | || | | - // | | | | | +-------------+ | | - // | | | | | | (VPaddingXs)| | | - // +------------+--------+---------+------+---------+-------------+------------+------------+ --+ - // | (VGapL) | +-- Gap between project items - // +----------------------------------------------------------------------------------------+ --+ + // +------------+--------+--------+------+---------+-------------+------------+------------+ + // | | | | | | (VPaddingXs)| | | + // | | | | | +-------------+ | | + // | | | | | || | | + // | | | | | +-------------+ | | + // |(HPaddingXs)||(HGapXs)||(HGapXxs)| (VGapXs) |(HPaddingXs)|(HPaddingXs)| + // | |(w:6) | | | +-------------+ | | + // | | | | | || | | + // | | | | | +-------------+ | | + // | | | | | | (VPaddingXs)| | | + // +------------+--------+--------+------+---------+-------------+------------+------------+ --+ + // | (VGapL) | +-- Gap between project items + // +---------------------------------------------------------------------------------------+ --+ const bool hovered = option.widget->isActiveWindow() && option.state & QStyle::State_MouseOver; @@ -651,9 +650,9 @@ public: const int x = bgR.x(); const int numberX = x + s(HPaddingXs); - const int iconX = numberX + shortcutNumberWidth + s(HGapXxs); + const int iconX = numberX + shortcutNumberWidth + s(HGapXs); const int iconWidth = iconS.width(); - const int textX = withIcon() ? iconX + iconWidth + s(HGapXxs) : iconX; + const int textX = withIcon() ? iconX + iconWidth + s(HGapXs) : iconX; const int textWidth = bgR.width() - s(HPaddingXs) - textX; const int y = bgR.y(); diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index 8d30659f31b..cad296ae5de 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -404,7 +404,6 @@ static const QStringList &plugins() "pydocstyle", "pyflakes", "pylint", - "rope_completion", "yapf"}; return plugins; } @@ -610,7 +609,6 @@ static QString defaultPylsConfiguration() plugins.insert("pydocstyle", disabled); plugins.insert("pyflakes", enabled); plugins.insert("pylint", disabled); - plugins.insert("rope_completion", enabled); plugins.insert("yapf", enabled); QJsonObject pylsp; pylsp.insert("plugins", plugins); diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 18a9c4d0f26..cef1aefcd2b 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -750,6 +750,9 @@ static Utils::FilePath qmllsForFile(const Utils::FilePath &file, void QmlJSEditorDocumentPrivate::settingsChanged() { + if (q->isTemporary()) + return; + Utils::FilePath newQmlls = qmllsForFile(q->filePath(), ModelManagerInterface::instance()); if (m_qmllsStatus.qmllsPath == newQmlls) return; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index f94ff8ccf2f..a8d940c6efc 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -11,6 +11,8 @@ #include "qtversionfactory.h" #include "qtversionmanager.h" +#include + #include #include @@ -837,8 +839,11 @@ bool QtVersion::hasQtAbisSet() const Abis QtVersion::qtAbis() const { - if (!d->m_data.qtAbis) + if (!d->m_data.qtAbis + // QTCREATORBUG-30568 give AndroidQtVersion a "second chance" to detect Qt Abis + || (d->m_type == Android::Constants::ANDROID_QT_TYPE && d->m_data.qtAbis->isEmpty())) { d->m_data.qtAbis = detectQtAbis(); + } return *d->m_data.qtAbis; } diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 756f1a11bee..c7bdab9b2a8 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -119,8 +119,12 @@ void TerminalWidget::setupPty() Environment env = m_openParameters.environment.value_or(Environment{}) .appliedToEnvironment(shellCommand.executable().deviceEnvironment()); + // Some OS/Distros set a default value for TERM such as "dumb", which then breaks + // command line tools such as "clear" which try to figure out what terminal they are + // running in. Therefore we have to force-set our own TERM value here. + env.set("TERM", "xterm-256color"); + // Set some useful defaults - env.setFallback("TERM", "xterm-256color"); env.setFallback("TERM_PROGRAM", QCoreApplication::applicationName()); env.setFallback("COLORTERM", "truecolor"); env.setFallback("COMMAND_MODE", "unix2003"); diff --git a/src/plugins/texteditor/codestyleselectorwidget.cpp b/src/plugins/texteditor/codestyleselectorwidget.cpp index ddeea0a74eb..5eb373f00f1 100644 --- a/src/plugins/texteditor/codestyleselectorwidget.cpp +++ b/src/plugins/texteditor/codestyleselectorwidget.cpp @@ -216,9 +216,11 @@ void CodeStyleSelectorWidget::slotImportClicked() void CodeStyleSelectorWidget::slotExportClicked() { ICodeStylePreferences *currentPreferences = m_codeStyle->currentPreferences(); - const FilePath filePath = FileUtils::getSaveFilePath(this, Tr::tr("Export Code Style"), - FilePath::fromString(QString::fromUtf8(currentPreferences->id() + ".xml")), - Tr::tr("Code styles (*.xml);;All files (*)")); + const FilePath filePath = FileUtils::getSaveFilePath( + this, + Tr::tr("Export Code Style"), + FileUtils::homePath().pathAppended(QString::fromUtf8(currentPreferences->id() + ".xml")), + Tr::tr("Code styles (*.xml);;All files (*)")); if (!filePath.isEmpty()) { CodeStylePool *codeStylePool = m_codeStyle->delegatingPool(); codeStylePool->exportCodeStyle(filePath, currentPreferences); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 1d90c7481f2..bea58df3c88 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -6876,7 +6876,8 @@ void TextEditorWidgetPrivate::handleBackspaceKey() } } } else if (typingSettings.m_smartBackspaceBehavior == TypingSettings::BackspaceUnindents) { - if (c.positionInBlock() > TabSettings::firstNonSpace(c.block().text())) { + if (c.positionInBlock() == 0 + || c.positionInBlock() > TabSettings::firstNonSpace(c.block().text())) { if (cursorWithinSnippet) c.beginEditBlock(); c.deletePreviousChar(); diff --git a/src/shared/qbs b/src/shared/qbs index ca74c524363..488fbe40e86 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit ca74c524363d17c689bb0ec4ca39c744df8d036e +Subproject commit 488fbe40e86602d06e568a1749277387fd4a565e diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 78178d82bb8..176b606b8bf 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -113,10 +113,7 @@ def handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms, return fixedBuildSystems = list(availableBuildSystems) - if template == 'Qt Quick Application': - fixedBuildSystems.remove('qmake') - test.log("Skipped qmake (not supported).") - elif template == 'Qt Quick 2 Extension Plugin': + if template == 'Qt Quick 2 Extension Plugin': fixedBuildSystems.remove('Qbs') test.log("Skipped Qbs (not supported).") @@ -126,7 +123,7 @@ def handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms, clickButton(waitForObject(":Next_QPushButton")) if specialHandlingFunc: specialHandlingFunc(displayedPlatforms, *args) - if not ('Plain C' in template or template == 'Qt Quick Application'): + if not ('Plain C' in template): __createProjectHandleTranslationSelection__() verifyKitCheckboxes(kits, displayedPlatforms) safeClickButton("Cancel") diff --git a/tests/system/suite_tools/tst_designer_autocomplete/test.py b/tests/system/suite_tools/tst_designer_autocomplete/test.py index c72d86a4e2e..b378407f812 100644 --- a/tests/system/suite_tools/tst_designer_autocomplete/test.py +++ b/tests/system/suite_tools/tst_designer_autocomplete/test.py @@ -25,7 +25,9 @@ def main(): openContextMenu(waitForObject("{container=':*Qt Creator.FormEditorStack_Designer::Internal::FormEditorStack'" "text='PushButton' type='QPushButton' visible='1'}"), 5, 5, 1) activateItem(waitForObjectItem("{type='QMenu' unnamed='1' visible='1'}", "Change objectName...")) - typeLines(waitForObject(":FormEditorStack_qdesigner_internal::PropertyLineEdit"), buttonName) + buttonNameEdit = waitForObject(":FormEditorStack_qdesigner_internal::PropertyLineEdit") + replaceEditorContent(buttonNameEdit, buttonName) + type(buttonNameEdit, "") else: # Verify that everything works without ever changing the name buttonName = "pushButton"