diff --git a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc index 6a1d6a12277..b2dc857e458 100644 --- a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -219,7 +219,7 @@ Ubuntu or Debian?} \code - sudo apt-get install libglib2.0-dev libSM-dev libxrender-dev libfontconfig1-dev libxext-dev + sudo apt-get install libglib2.0-dev libsm-dev libxrender-dev libfontconfig1-dev libxext-dev \endcode If you use QtOpenGL, you also need: diff --git a/doc/qtcreator/src/overview/creator-only/creator-desktop-platforms.qdoc b/doc/qtcreator/src/overview/creator-only/creator-desktop-platforms.qdoc index 5776d92e8ba..91696e03c1c 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-desktop-platforms.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-desktop-platforms.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -30,7 +30,7 @@ \li g++ \li make \li libglib2.0-dev - \li libSM-dev + \li libsm-dev \li libxrender-dev \li libfontconfig1-dev \li libxext-dev diff --git a/qbs/modules/pluginjson/pluginjson.qbs b/qbs/modules/pluginjson/pluginjson.qbs index eccd53c85bd..e210731f0bf 100644 --- a/qbs/modules/pluginjson/pluginjson.qbs +++ b/qbs/modules/pluginjson/pluginjson.qbs @@ -19,7 +19,7 @@ Module { // TODO: Could something like this be incorporated into the vcs module? // Currently, the default repo dir is project.sourceDirectory, which // does not make sense for Qt Creator. - var dir = sourceDirectory; + var dir = product.sourceDirectory; while (true) { if (File.exists(FileInfo.joinPaths(dir, ".git"))) return dir; diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 05113e43e77..79aea111bdd 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -273,13 +273,20 @@ def deploy_elfutils(qtc_install_dir, chrpath_bin, args): if common.is_mac_platform(): return + libs = ['elf', 'dw'] + version = '1' + def lib_name(name, version): return ('lib' + name + '.so.' + version if common.is_linux_platform() else name + '.dll') - version = '1' - libs = ['elf', 'dw'] - elfutils_lib_path = os.path.join(args.elfutils_path, 'lib') + def find_elfutils_lib_path(path): + for root, _, files in os.walk(path): + if lib_name('elf', version) in files: + return root + return path + + elfutils_lib_path = find_elfutils_lib_path(os.path.join(args.elfutils_path, 'lib')) if common.is_linux_platform(): install_path = os.path.join(qtc_install_dir, 'lib', 'elfutils') backends_install_path = install_path diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.6.x.txt b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.6.x.txt new file mode 100644 index 00000000000..9d2fc4a82cc --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.6.x.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.16) + +project(%{ProjectName} VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt6 6.2 COMPONENTS Quick REQUIRED) + +qt_add_executable(%{TargetName} + main.cpp +) + +qt_add_qml_module(%{TargetName} + URI %{ProjectName} + VERSION 1.0 + QML_FILES main.qml %{AdditionalQmlFiles} +) + +set_target_properties(%{TargetName} PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +target_link_libraries(%{TargetName} + PRIVATE Qt6::Quick) + +install(TARGETS %{TargetName} + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.txt new file mode 100644 index 00000000000..3b5806eb093 --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/CMakeLists.txt @@ -0,0 +1,79 @@ +cmake_minimum_required(VERSION 3.14) + +project(%{ProjectName} VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +@if %{HasTranslation} +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick LinguistTools) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick LinguistTools) + +set(TS_FILES %{TsFileName}) +@else +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick) +@endif + +set(PROJECT_SOURCES + %{MainCppFileName} + qml.qrc + @if %{HasTranslation} + ${TS_FILES} + @endif +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(%{ProjectName} + MANUAL_FINALIZATION + ${PROJECT_SOURCES} + ) +# Define target properties for Android with Qt 6 as: +# set_property(TARGET %{ProjectName} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR +# ${CMAKE_CURRENT_SOURCE_DIR}/android) +# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation +@if %{HasTranslation} + + qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) +@endif +else() + if(ANDROID) + add_library(%{ProjectName} SHARED + ${PROJECT_SOURCES} + ) +# Define properties for Android with Qt 5 after find_package() calls as: +# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") + else() + add_executable(%{ProjectName} + ${PROJECT_SOURCES} + ) + endif() +@if %{HasTranslation} + + qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) +@endif +endif() + +target_link_libraries(%{ProjectName} + PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick) + +set_target_properties(%{ProjectName} PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +install(TARGETS %{ProjectName} + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_import_qml_plugins(%{ProjectName}) + qt_finalize_executable(%{ProjectName}) +endif() diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.pro b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.pro new file mode 100644 index 00000000000..1e0811386ab --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.pro @@ -0,0 +1,40 @@ +@if "%{UseVirtualKeyboard}" == "true" +QT += quick virtualkeyboard +@else +QT += quick +@endif +@if !%{IsQt6} + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +@endif + +SOURCES += \\ + %{MainCppFileName} + +@if %{IsQt6} +resources.files = main.qml %{AdditionalQmlFiles} +resources.prefix = /$${TARGET} +RESOURCES += resources +@else +RESOURCES += qml.qrc +@endif +@if %{HasTranslation} + +TRANSLATIONS += \\ + %{TsFileName} +CONFIG += lrelease +CONFIG += embed_translations +@endif + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.qbs b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.qbs new file mode 100644 index 00000000000..14025b37b82 --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/app.qbs @@ -0,0 +1,48 @@ +import qbs + +CppApplication { +@if "%{UseVirtualKeyboard}" == "true" + Depends { name: "Qt"; submodules: ["quick", "virtualkeyboard"] } +@else + Depends { name: "Qt.quick" } +@endif + + install: true + + // Additional import path used to resolve QML modules in Qt Creator's code model + property pathList qmlImportPaths: [] +@if !%{IsQt6} + + cpp.defines: [ + // You can make your code fail to compile if it uses deprecated APIs. + // In order to do so, uncomment the following line. + //"QT_DISABLE_DEPRECATED_BEFORE=0x060000" // disables all the APIs deprecated before Qt 6.0.0 + ] +@endif + + files: [ + "%{MainCppFileName}", +@if !%{IsQt6} + "main.qml", + "qml.qrc", +@endif +@if %{HasTranslation} + "%{TsFileName}", +@endif + ] + @if %{HasTranslation} + + Group { + fileTagsFilter: "qm" + Qt.core.resourcePrefix: "/i18n" + fileTags: "qt.core.resource_data" + } +@endif +@if %{IsQt6} + Group { + files: ["main.qml"%{AdditionalQmlFilesQbs}] + Qt.core.resourcePrefix: "%{ProjectName}/" + fileTags: ["qt.qml.qml", "qt.core.resource_data"] + } +@endif +} diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon.png b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon.png new file mode 100644 index 00000000000..cb0a6d3b602 Binary files /dev/null and b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon.png differ diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon@2x.png b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon@2x.png new file mode 100644 index 00000000000..7b0df0dfa5f Binary files /dev/null and b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/icon@2x.png differ diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/main.qml.tpl b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/main.qml.tpl new file mode 100644 index 00000000000..36607ad82e9 --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/main.qml.tpl @@ -0,0 +1,48 @@ +import QtQuick %{QtQuickVersion} +@if !%{IsQt6} +import QtQuick.Window %{QtQuickWindowVersion} +@endif +@if %{UseVirtualKeyboard} +import %{QtQuickVirtualKeyboardImport} +@endif + +Window { +@if %{UseVirtualKeyboard} + id: window +@endif + width: 640 + height: 480 + visible: true + title: qsTr("Hello World") +@if %{UseVirtualKeyboard} + + InputPanel { + id: inputPanel + z: 99 + x: 0 + y: window.height + width: window.width + + states: State { + name: "visible" + when: inputPanel.active + PropertyChanges { + target: inputPanel + y: window.height - inputPanel.height + } + } + transitions: Transition { + from: "" + to: "visible" + reversible: true + ParallelAnimation { + NumberAnimation { + properties: "y" + duration: 250 + easing.type: Easing.InOutQuad + } + } + } + } +@endif +} diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/qml.qrc b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/qml.qrc new file mode 100644 index 00000000000..5f6483ac33f --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/qml.qrc @@ -0,0 +1,5 @@ + + + main.qml + + diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/wizard.json new file mode 100644 index 00000000000..c2365108daa --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/empty/wizard.json @@ -0,0 +1,230 @@ +{ + "version": 1, + "supportedProjectTypes": [ "CMakeProjectManager.CMakeProject", "Qbs.QbsProject", "Qt4ProjectManager.Qt4Project" ], + "id": "V.QtQuickApplicationEmptyCompat", + "category": "D.ApplicationQt", + "trDescription": "Creates a Qt Quick application that contains an empty window.\n\nUse this \"compat\" version if you want to use other build systems than CMake or Qt versions lower than 6.", + "trDisplayName": "Qt Quick Application (compat)", + "trDisplayCategory": "Application (Qt)", + "icon": "icon.png", + "iconKind": "Themed", + "featuresRequired": [ "QtSupport.Wizards.FeatureQt.5.6" ], + "enabled": "%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0 || value('Plugins').indexOf('QbsProjectManager') >= 0 || value('Plugins').indexOf('CMakeProjectManager') >= 0}", + + "options": + [ + { "key": "ProjectFile", "value": "%{JS: value('BuildSystem') === 'qmake' ? value('ProFile') : (value('BuildSystem') === 'cmake' ? value('CMakeFile') : value('QbsFile'))}" }, + { "key": "ProFile", "value": "%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'pro')}" }, + { "key": "QbsFile", "value": "%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'qbs')}" }, + { "key": "CMakeFile", "value": "%{ProjectDirectory}/CMakeLists.txt" }, + { "key": "IsQt6", "value": "%{JS: value('QtVersion').IsQt6}" }, + { "key": "MainCppFileName", "value": "%{JS: 'main.' + Util.preferredSuffix('text/x-c++src')}" }, + { "key": "QtQuickVersion", "value": "%{JS: value('QtVersion').QtQuickVersion}" }, + { "key": "QtQuickWindowVersion", "value": "%{JS: value('QtVersion').QtQuickWindowVersion}" }, + { "key": "QtQuickVirtualKeyboardImport", "value": "%{JS: value('QtVersion').QtQuickVirtualKeyboardImport}" }, + { "key": "QtQuickFeature", "value": "%{JS: (value('QtQuickVersion')=='') ? 'QtSupport.Wizards.FeatureQt.6.2' : 'QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}'}" }, + { "key": "UseVirtualKeyboardByDefault", "value": "%{JS: value('Plugins').indexOf('Boot2Qt') >= 0 || value('Plugins').indexOf('Boot2QtQdb') >= 0}" }, + { "key": "HasTranslation", "value": "%{JS: value('TsFileName') !== ''}" }, + { "key": "SetQPAPhysicalSize", "value": "%{UseVirtualKeyboardByDefault}" }, + { "key": "AdditionalQmlFiles", "value": "" }, + { "key": "AdditionalQmlFilesQbs", "value": "" }, + { "key": "TargetName", "value": "%{JS: 'app' + value('ProjectName')}" } + ], + + "pages": + [ + { + "trDisplayName": "Project Location", + "trShortTitle": "Location", + "typeId": "Project" + }, + { + "trDisplayName": "Define Build System", + "trShortTitle": "Build System", + "typeId": "Fields", + "enabled": "%{JS: !value('IsSubproject')}", + "data": + [ + { + "name": "BuildSystem", + "trDisplayName": "Build system:", + "type": "ComboBox", + "persistenceKey": "BuildSystemType", + "data": + { + "index": 1, + "items": + [ + { + "trKey": "qmake", + "value": "qmake", + "condition": "%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0}" + }, + { + "trKey": "CMake", + "value": "cmake", + "condition": "%{JS: value('Plugins').indexOf('CMakeProjectManager') >= 0}" + }, + { + "trKey": "Qbs", + "value": "qbs", + "condition": "%{JS: value('Plugins').indexOf('QbsProjectManager') >= 0}" + } + ] + } + } + ] + }, + { + "trDisplayName": "Define Project Details", + "trShortTitle": "Details", + "typeId": "Fields", + "data": + [ + { + "name": "QtVersion", + "trDisplayName": "Minimum required Qt version:", + "type": "ComboBox", + "persistenceKey": "QtQuick.minimumQtVersion", + "data": + { + "index": 1, + "items": + [ + { + "trKey": "Qt 6.2", + "value": + { + "QtQuickVersion": "", + "QtQuickWindowVersion": "", + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard", + "IsQt6": true + } + }, + { + "trKey": "Qt 5.15", + "value": + { + "QtQuickVersion": "2.15", + "QtQuickWindowVersion": "2.15", + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.15", + "IsQt6": false + } + }, + { + "trKey": "Qt 5.14", + "value": + { + "QtQuickVersion": "2.14", + "QtQuickWindowVersion": "2.14", + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.14", + "IsQt6": false + } + }, + { + "trKey": "Qt 5.13", + "value": + { + "QtQuickVersion": "2.13", + "QtQuickWindowVersion": "2.13", + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4", + "IsQt6": false + } + }, + { + "trKey": "Qt 5.12", + "value": + { + "QtQuickVersion": "2.12", + "QtQuickWindowVersion": "2.12", + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4", + "IsQt6": false + } + } + ] + } + }, + { + "name": "UseVirtualKeyboard", + "trDisplayName": "Use Qt Virtual Keyboard", + "type": "CheckBox", + "persistenceKey": "QtQuick.UseVirtualKeyboard.%{UseVirtualKeyboardByDefault}", + "data": + { + "checked": "%{UseVirtualKeyboardByDefault}" + } + } + ] + }, + { + "trDisplayName": "Translation File", + "trShortTitle": "Translation", + "typeId": "QtTranslation" + }, + { + "trDisplayName": "Kit Selection", + "trShortTitle": "Kits", + "typeId": "Kits", + "enabled": "%{JS: !value('IsSubproject')}", + "data": { + "projectFilePath": "%{ProjectFile}", + "requiredFeatures": [ "QtSupport.Wizards.FeatureQt", "%{QtQuickFeature}" ] + } + }, + { + "trDisplayName": "Project Management", + "trShortTitle": "Summary", + "typeId": "Summary" + } + ], + "generators": + [ + { + "typeId": "File", + "data": + [ + { + "source": "../app.pro", + "target": "%{ProFile}", + "openAsProject": true, + "condition": "%{JS: value('BuildSystem') === 'qmake'}" + }, + { + "source": "%{JS: value('QtVersion').IsQt6 ? '../CMakeLists.6.x.txt' : '../CMakeLists.txt'}", + "target": "CMakeLists.txt", + "openAsProject": true, + "condition": "%{JS: value('BuildSystem') === 'cmake'}" + }, + { + "source": "../app.qbs", + "target": "%{QbsFile}", + "openAsProject": true, + "condition": "%{JS: value('BuildSystem') === 'qbs'}" + }, + { + "source": "../main.cpp", + "target": "%{MainCppFileName}" + }, + { + "source": "main.qml.tpl", + "target": "main.qml", + "openInEditor": true + }, + { + "source": "qml.qrc", + "condition": "%{JS: !value('QtVersion').IsQt6}" + }, + { + "source": "../../translation.ts", + "target": "%{TsFileName}", + "condition": "%{HasTranslation}" + }, + { + "source": "../../git.ignore", + "target": ".gitignore", + "condition": "%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git'}" + } + ] + } + ] +} diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp new file mode 100644 index 00000000000..08698bb6bea --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp @@ -0,0 +1,58 @@ +%{Cpp:LicenseTemplate}\ +%{JS: QtSupport.qtIncludes([], ["QtGui/QGuiApplication", "QtQml/QQmlApplicationEngine"])} +@if %{HasTranslation} +#include +#include +@endif + +int main(int argc, char *argv[]) +{ +@if %{UseVirtualKeyboard} + qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); + +@endif +@if !%{IsQt6} +@if %{SetQPAPhysicalSize} + if (qEnvironmentVariableIsEmpty("QTGLESSTREAM_DISPLAY")) { + qputenv("QT_QPA_EGLFS_PHYSICAL_WIDTH", QByteArray("213")); + qputenv("QT_QPA_EGLFS_PHYSICAL_HEIGHT", QByteArray("120")); + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif + } +@else +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif +@endif +@endif + QGuiApplication app(argc, argv); +@if %{HasTranslation} + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "%{JS: value('ProjectName') + '_'}" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + app.installTranslator(&translator); + break; + } + } +@endif + + QQmlApplicationEngine engine; +@if %{IsQt6} + const QUrl url(u"qrc:/%{JS: value('ProjectName')}/main.qml"_qs); +@else + const QUrl url(QStringLiteral("qrc:/main.qml")); +@endif + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +} diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/qtquickcontrols2.conf b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/qtquickcontrols2.conf new file mode 100644 index 00000000000..fd44f05995d --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/qtquickcontrols2.conf @@ -0,0 +1,25 @@ +; This file can be edited to change the style of the application +; Read "Qt Quick Controls 2 Configuration File" for details: +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html +@if '%{QtQuickControlsStyle}' != 'Default' + +[Controls] +Style=%{QtQuickControlsStyle} +@if '%{QtQuickControlsStyle}' == 'Universal' + +[Universal] +Theme=%{QtQuickControlsStyleTheme} +;Accent=Steel +;Foreground=Brown +;Background=Steel +@endif +@if '%{QtQuickControlsStyle}' == 'Material' + +[Material] +Theme=%{QtQuickControlsStyleTheme} +;Accent=BlueGrey +;Primary=BlueGray +;Foreground=Brown +;Background=Grey +@endif +@endif diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 0125854d3a9..a49b915b5a2 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -40138,11 +40138,11 @@ fails because Clang does not understand the target architecture. Buffered output - + Ausgabe puffern Enabling improves output performance, but results in delayed output. - + Aktivieren dieser Option verbessert die Leistung der Anwendung, resultiert aber in verzögerter Ausgabe. Script: @@ -40162,15 +40162,15 @@ fails because Clang does not understand the target architecture. Executable is empty. - + Ausführbare Datei ist leer. %1 does not exist. - + %1 existiert nicht. %1 is not an executable file. - + %1 ist keine ausführbare Datei. &Add @@ -40186,11 +40186,11 @@ fails because Clang does not understand the target architecture. &Clean Up - + &Bereiningen Remove all Python interpreters without a valid executable. - + Entfernt alle Python-Interpreter ohne gültige ausführbare Datei. Interpreters @@ -40202,43 +40202,43 @@ fails because Clang does not understand the target architecture. Plugins: - + Plugins: Use Python Language Server - + Python Language Server benutzen For a complete list of available options, consult the <a href="https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md">Python LSP Server configuration documentation</a>. - + Für eine vollständige Liste der verfügbaren Optionen siehe auch die <a href="https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md">Dokumentation zur Python LSP-Server-Konfiguration</a>. Advanced - Erweitert + Erweitert Language Server Configuration - + Language Server-Konfiguration (Windowed) - + (mit Fenster) Removing Python - + Entferne Python Python: - + Python: %1 installation missing for %2 (%3) - + %1-Installation fehlt für %2 (%3) Install %1 for %2 using pip package installer. - + Installiere %1 für %2 mit dem pip Paket-Installationsprogramm. Install @@ -40246,95 +40246,99 @@ fails because Clang does not understand the target architecture. Install %1 - + This is the header of a progress bar + Installiere %1 Running "%1" to install %2. - + Führe "%1" aus, um %2 zu installieren. The %1 installation was canceled by %2. - + %2 can be "user" or "time out" which doesn't work in non-english... so working around that. + Die Installation von %1 wurde abgebrochen: %2. user - + Used as %2 in "Die Installation von %1 wurde abgebrochen: %2." + Der Nutzer hat den Prozess abgebrochen time out - + Used as %2 in "Die Installation von %1 wurde abgebrochen: %2." + Zeitüberschreitung Installing the %1 failed with exit code %2 - + Installation von %1 ist mit dem Rückgabewert %2 fehlgeschlagen Run PySide6 project tool - + PySide6 Projektwerkzeug ausführen PySide project tool: - + PySide Projektwerkzeug: Enter location of PySide project tool. - + Geben Sie den Ort des PySide Projektwerkzeugs ein. General - Allgemein + Allgemein REPL - + REPL Open interactive Python. - + Interaktives Python öffnen. REPL Import File - + REPL mit Datei-Import Open interactive Python and import file. - + Interaktives Python öffnen und Datei importieren. REPL Import * - + REPL mit *-Import Open interactive Python and import * from file. - + Interaktives Python öffnen und alles (*) aus der Datei importieren. Open interactive Python. Either importing nothing, importing the current file, or importing everything (*) from the current file. - + Interaktives Python öffnen. Importiert entweder nichts, die aktuelle Datei oder alles (*) aus der aktuellen Datei. No Python Selected - + Kein Python ausgewählt Manage Python Interpreters - + Python-Interpreter verwalten Python Language Server (%1) - + Python Language Server (%1) Install Python language server (PyLS) for %1 (%2). The language server provides Python specific completion and annotation. - + Python Language Server (PyLS) für %1 (%2) installieren. Der Language Server stellt Code-Vervollständigung und Annotationen für Python zur Verfügung. Searching Python binaries... - + Suche ausführbare Python-Dateien... Found "%1" (%2) - + "%1" (%2) gefunden diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 3c1beded9e6..bf09c6b901e 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -246,7 +246,7 @@ The directory %1 already contains a cbp file, which is recent enough. You can pass special arguments or change the used tool chain here and rerun CMake. Or simply finish the wizard directly. - 目錄 %1 已存在一份足夠新的 cbp 檔。您可以在此傳送特殊引數,或是變更所使用的工具鍊,然後重新執行 CMake。或者您也可以直接結束此精靈。 + 目錄 %1 已存在一份足夠新的 cbp 檔。您可以在此傳送特殊引數,或是變更所使用的工具鏈,然後重新執行 CMake。或者您也可以直接結束此精靈。 The directory %1 does not contain a cbp file. Qt Creator needs to create this file by running CMake. Some projects require command line arguments to the initial CMake call. @@ -315,7 +315,7 @@ <b>Unknown tool chain</b> - <b>未知的工具鍊</b> + <b>未知的工具鏈</b> Please enter the directory in which you want to build your project. @@ -3292,7 +3292,7 @@ at debugger startup. &Tool chain: - 工具鍊(&T): + 工具鏈(&T): Break at '&main': @@ -3304,7 +3304,7 @@ at debugger startup. Tool &chain: - 工具鍊(&C): + 工具鏈(&C): &Host and port: @@ -4480,11 +4480,11 @@ Reason: %3 Tool chain: - 工具鍊: + 工具鏈: <Invalid tool chain> - <無效的工具鍊> + <無效的工具鏈> Generic Manager @@ -7385,11 +7385,11 @@ Preselects a desktop Qt for building the application if available. using Qt version: <b>%1</b><br>with tool chain <b>%2</b><br>building in <b>%3</b> - 使用 Qt 版本:<b>%1</b><br>和工具鍊 <b>%2</b><br>在目錄 <b>%3</b> 中建置 + 使用 Qt 版本:<b>%1</b><br>和工具鏈 <b>%2</b><br>在目錄 <b>%3</b> 中建置 <Invalid tool chain> - <無效的工具鍊> + <無效的工具鏈> General @@ -7426,7 +7426,7 @@ Preselects a desktop Qt for building the application if available. <No tool chain selected> - <沒有選擇工具鍊> + <沒有選擇工具鏈> An incompatible build exists in %1, which will be overwritten. @@ -7443,7 +7443,7 @@ Preselects a desktop Qt for building the application if available. Tool chain: - 工具鍊: + 工具鏈: Shadow build: @@ -7592,11 +7592,11 @@ Preselects a desktop Qt for building the application if available. Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode. - Qt Creator 需要先設定建置組態才能執行建置。請在專案模式下組態工具鍊。 + Qt Creator 需要先設定建置組態才能執行建置。請在專案模式下組態工具鏈。 Qt Creator needs a tool chain set up to build. Configure a tool chain in Project mode. - Qt Creator 需要設置一個工具鍊才能建置。請在專案模式下組態工具鍊。 + Qt Creator 需要設置一個工具鏈才能建置。請在專案模式下組態工具鏈。 Cannot find Makefile. Check your build settings. @@ -7685,7 +7685,7 @@ Preselects a desktop Qt for building the application if available. <b>Warning:</b> The tool chain suggests using another mkspec. - <b>警告:</b> 工具鍊建議使用另一個 mkspec。 + <b>警告:</b> 工具鏈建議使用另一個 mkspec。 Enable QML debugging: @@ -13411,7 +13411,7 @@ Requires <b>Qt 4.7.4</b> or newer. ABI detection failed: Make sure to use a matching tool chain when building. - ABI 偵測失敗:請確認使用的工具鍊是否正確。 + ABI 偵測失敗:請確認使用的工具鏈是否正確。 No qmlscene installed. @@ -13466,7 +13466,7 @@ Requires <b>Qt 4.7.4</b> or newer. Building helper(s) with toolchain '%1'... - 正在使用工具鍊 '%1' 建置小助手... + 正在使用工具鏈 '%1' 建置小助手... @@ -13769,11 +13769,11 @@ with a password, which you can enter below. The Symbian tool chain does not handle spaces in the project path '%1'. - Symbian 工具鍊不能處理在專案路徑 '%1' 中的空白。 + Symbian 工具鏈不能處理在專案路徑 '%1' 中的空白。 The Symbian tool chain does not handle special characters in the project name '%1' well. - Symbian 的工具鍊不能處理專案名稱 '%1' 中的特殊字元。 + Symbian 的工具鏈不能處理專案名稱 '%1' 中的特殊字元。 @@ -18977,15 +18977,15 @@ Do you want to retry? The following tool chain was already configured:<br>&nbsp;%1<br>It was not configured again. - 已組態以下工具鍊:<br>&nbsp;%1<br>因此未再次組態。 + 已組態以下工具鏈:<br>&nbsp;%1<br>因此未再次組態。 Duplicate Tool Chains detected - 偵測到工具鍊有重複 + 偵測到工具鏈有重複 The following tool chains were already configured:<br>&nbsp;%1<br>They were not configured again. - 已組態以下工具鍊:<br>&nbsp;%1<br>因此未再次組態。 + 已組態以下工具鏈:<br>&nbsp;%1<br>因此未再次組態。 @@ -20328,7 +20328,7 @@ if (a && Tool chain: - 工具鍊: + 工具鏈: Compiler: @@ -21416,7 +21416,7 @@ Do you want to retry? No valid tool chain has been detected.<br>Define a correct tool chain in "Options > Tool Chains" - 沒有偵測到有效的工具鍊。<br>請在「選項」─「工具鍊」中定義一個正確的工具鍊 + 沒有偵測到有效的工具鏈。<br>請在「選項」─「工具鏈」中定義一個正確的工具鏈 Choose a build configuration: @@ -21424,7 +21424,7 @@ Do you want to retry? Choose a tool chain: - 選擇一個工具鍊: + 選擇一個工具鏈: Launching @@ -21562,11 +21562,11 @@ Do you want to retry? No tool chain can produce code for this Qt version. Please define one or more tool chains. - 沒有這個 Qt 版本使用的工具鍊。請定義一個或更多工具鍊。 + 沒有這個 Qt 版本使用的工具鏈。請定義一個或更多工具鏈。 Not all possible target environments can be supported due to missing tool chains. - 因為缺少工具鍊,所以不是所有的目標平台都能被支援。 + 因為缺少工具鏈,所以不是所有的目標平台都能被支援。 The following ABIs are currently not supported:<ul><li>%1</li></ul> @@ -26093,11 +26093,11 @@ should a repository require SSH-authentication (see documentation on SSH and the Tool chain: - 工具鍊: + 工具鏈: <Invalid tool chain> - <無效的工具鍊> + <無效的工具鏈> Failed opening project '%1': Project file does not exist @@ -26174,7 +26174,7 @@ should a repository require SSH-authentication (see documentation on SSH and the <b>Unknown tool chain</b> - <b>未知的工具鍊</b> + <b>未知的工具鏈</b> @@ -26650,7 +26650,7 @@ references to elements in other files, loops, etc.) <p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses the Qt version: <b>%2</b> and the tool chain: <b>%3</b> to parse the project. You can edit these in the <b><a href="edit">options.</a></b></p> - <p>專案 <b>%1</b>還沒組態。</p><p>Qt Creator 使用的 Qt 版本: <b>%2</b> 和工具鍊: <b>%3</b> 來解析專案。 你可以編輯這些 <b><a href="edit">選項.</a></b></p> + <p>專案 <b>%1</b>還沒組態。</p><p>Qt Creator 使用的 Qt 版本: <b>%2</b> 和工具鏈: <b>%3</b> 來解析專案。 你可以編輯這些 <b><a href="edit">選項.</a></b></p> Qt Version: @@ -26658,7 +26658,7 @@ references to elements in other files, loops, etc.) Tool Chain: - 工具鍊: + 工具鏈: diff --git a/src/libs/utils/fileinprojectfinder.cpp b/src/libs/utils/fileinprojectfinder.cpp index f92cb70fa78..6ee3c34becd 100644 --- a/src/libs/utils/fileinprojectfinder.cpp +++ b/src/libs/utils/fileinprojectfinder.cpp @@ -248,7 +248,10 @@ bool FileInProjectFinder::findFileOrDirectory(const FilePath &originalPath, File } } while (prefixToIgnore != -1) { - FilePath candidate = originalPath.resolvePath(m_projectDir); + QString candidateString = originalPath.toFSPathString(); + candidateString.remove(0, prefixToIgnore); + candidateString.prepend(m_projectDir.toString()); + const FilePath candidate = FilePath::fromString(candidateString); const int matchLength = origLength - prefixToIgnore; // FIXME: This might be a worse match than what we find later. if (checkPath(candidate, matchLength, fileHandler, directoryHandler)) { diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 69c31729149..1f6d89c43ae 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -62,6 +62,10 @@ bool FileReader::fetch(const FilePath &filePath, QIODevice::OpenMode mode) return false; } m_data = *contents; + + if (mode & QIODevice::Text) + m_data = m_data.replace("\r\n", "\n"); + return true; } diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 7567cc06183..2676fa6305c 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -122,7 +122,7 @@ static void findProcessPIDAndUser(QFutureInterface &fi, QStringList if (!out.isEmpty()) { QRegularExpressionMatch match; qsizetype matchPos = out.indexOf(userIdPattern, 0, &match); - if (matchPos >= 0 && match.hasCaptured(1) && match.capturedLength(1) > 0) { + if (matchPos >= 0 && match.capturedLength(1) > 0) { bool ok = false; processUser = match.captured(1).toInt(&ok); if (!ok) diff --git a/src/plugins/autotest/quick/quicktesttreeitem.cpp b/src/plugins/autotest/quick/quicktesttreeitem.cpp index 49358f49ebd..f721ce3bc0d 100644 --- a/src/plugins/autotest/quick/quicktesttreeitem.cpp +++ b/src/plugins/autotest/quick/quicktesttreeitem.cpp @@ -375,8 +375,14 @@ QSet internalTargets(const FilePath &proFile) for (const CppEditor::ProjectPart::ConstPtr &projectPart : projectInfo->projectParts()) { if (projectPart->buildTargetType != ProjectExplorer::BuildTargetType::Executable) continue; - if (projectPart->projectFile == proFile.toString()) + if (projectPart->projectFile != proFile.toString()) + continue; + if (Utils::anyOf(projectPart->projectMacros, [](const ProjectExplorer::Macro ¯o){ + return macro.type == ProjectExplorer::MacroType::Define && + macro.key == "QUICK_TEST_SOURCE_DIR"; + })) { result.insert(projectPart->buildSystemTarget); + } } return result; } diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp index 1b57403f32c..a0344e14eda 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp @@ -196,4 +196,10 @@ void ClangFormatGlobalConfigWidget::apply() settings.write(); } +void ClangFormatGlobalConfigWidget::finish() +{ + m_codeStyle->currentPreferences()->setTemporarilyReadOnly( + !ClangFormatSettings::instance().overrideDefaultFile()); +} + } // namespace ClangFormat diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.h b/src/plugins/clangformat/clangformatglobalconfigwidget.h index 989aa58a925..063c82852a3 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.h +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.h @@ -28,6 +28,7 @@ public: QWidget *parent = nullptr); ~ClangFormatGlobalConfigWidget() override; void apply() override; + void finish() override; private: void initCheckBoxes(); diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index d1d6bee684b..120e27fde7b 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -171,12 +171,11 @@ clang::format::FormatStyle qtcStyle() style.SpacesInCStyleCastParentheses = false; style.SpacesInParentheses = false; style.SpacesInSquareBrackets = false; - style.StatementMacros.emplace_back("Q_OBJECT"); - style.StatementMacros.emplace_back("QT_BEGIN_NAMESPACE"); - style.StatementMacros.emplace_back("QT_END_NAMESPACE"); + addQtcStatementMacros(style); style.Standard = FormatStyle::LS_Cpp11; style.TabWidth = 4; style.UseTab = FormatStyle::UT_Never; + style.Standard = FormatStyle::LS_Auto; return style; } @@ -214,9 +213,10 @@ bool getCurrentOverriddenSettings(const Utils::FilePath &filePath) const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile( filePath); - return getProjectUseGlobalSettings(project) - ? ClangFormatSettings::instance().overrideDefaultFile() - : getProjectOverriddenSettings(project); + return getProjectUseGlobalSettings(project) ? !TextEditor::TextEditorSettings::codeStyle("Cpp") + ->currentPreferences() + ->isTemporarilyReadOnly() + : getProjectOverriddenSettings(project); } ClangFormatSettings::Mode getProjectIndentationOrFormattingSettings( @@ -276,9 +276,44 @@ Utils::FilePath configForFile(const Utils::FilePath &fileName) void addQtcStatementMacros(clang::format::FormatStyle &style) { - static const std::vector macros = {"Q_OBJECT", + static const std::vector macros = {"Q_CLASSINFO", + "Q_ENUM", + "Q_ENUM_NS", + "Q_FLAG", + "Q_FLAG_NS", + "Q_GADGET", + "Q_GADGET_EXPORT", + "Q_INTERFACES", + "Q_MOC_INCLUDE", + "Q_NAMESPACE", + "Q_NAMESPACE_EXPORT", + "Q_OBJECT", + "Q_PROPERTY", + "Q_REVISION", + "Q_DISABLE_COPY", + "Q_SET_OBJECT_NAME", "QT_BEGIN_NAMESPACE", - "QT_END_NAMESPACE"}; + "QT_END_NAMESPACE", + + "QML_ADDED_IN_MINOR_VERSION", + "QML_ANONYMOUS", + "QML_ATTACHED", + "QML_DECLARE_TYPE", + "QML_DECLARE_TYPEINFO", + "QML_ELEMENT", + "QML_EXTENDED", + "QML_EXTENDED_NAMESPACE", + "QML_EXTRA_VERSION", + "QML_FOREIGN", + "QML_FOREIGN_NAMESPACE", + "QML_IMPLEMENTS_INTERFACES", + "QML_INTERFACE", + "QML_NAMED_ELEMENT", + "QML_REMOVED_IN_MINOR_VERSION", + "QML_SINGLETON", + "QML_UNAVAILABLE", + "QML_UNCREATABLE", + "QML_VALUE_TYPE"}; for (const std::string ¯o : macros) { if (std::find(style.StatementMacros.begin(), style.StatementMacros.end(), macro) == style.StatementMacros.end()) diff --git a/src/plugins/clangformat/tests/clangformat-test.cpp b/src/plugins/clangformat/tests/clangformat-test.cpp index c5f77072e4b..80d2cc4da90 100644 --- a/src/plugins/clangformat/tests/clangformat-test.cpp +++ b/src/plugins/clangformat/tests/clangformat-test.cpp @@ -628,10 +628,16 @@ void ClangFormatTest::testCommentBlock() void ClangFormatTest::testClassIndentStructure() { - insertLines({"class test {", " Q_OBJECT", " public:", "};"}); + insertLines( + {"class test {", " Q_OBJECT", " QML_ELEMENT", " QML_SINGLETON", " public:", "};"}); m_indenter->indent(*m_cursor, QChar::Null, TextEditor::TabSettings()); QCOMPARE(documentLines(), - (std::vector{"class test {", " Q_OBJECT", "public:", "};"})); + (std::vector{"class test {", + " Q_OBJECT", + " QML_ELEMENT", + " QML_SINGLETON", + "public:", + "};"})); } void ClangFormatTest::testIndentInitializeVector() diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 7881b53916f..e583a6269de 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -55,7 +55,8 @@ private: connect(BuildManager::instance(), &BuildManager::buildQueueFinished, this, &ProjectBuilder::onBuildFinished, Qt::QueuedConnection); - BuildManager::buildProjectWithDependencies(target->project()); + if (!BuildManager::isBuilding(target)) + BuildManager::buildProjectWithDependencies(target->project()); } void onBuildFinished(bool success) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 9113c40700e..494d7ee67d7 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -1469,7 +1469,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) // Android magic: if (DeviceTypeKitAspect::deviceTypeId(k) == Android::Constants::ANDROID_DEVICE_TYPE) { buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); - const auto &bs = buildSteps()->steps().constLast(); + const auto bs = buildSteps()->steps().constLast(); cmd.addArg("-DANDROID_PLATFORM:STRING=" + bs->data(Android::Constants::AndroidNdkPlatform).toString()); auto ndkLocation = bs->data(Android::Constants::NdkLocation).value(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index ecf3228d318..ae6e26f9e32 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -100,7 +100,9 @@ Internal::PresetsData CMakeProject::combinePresets(Internal::PresetsData &cmakeP Utils::sort(presetsList, [](const auto &left, const auto &right) { const bool sameInheritance = left.inherits && right.inherits && left.inherits.value() == right.inherits.value(); - if (!left.inherits || left.inherits.value().contains(right.name) || sameInheritance) + const bool leftInheritsRight = left.inherits + && left.inherits.value().contains(right.name); + if ((left.inherits && !right.inherits) || leftInheritsRight || sameInheritance) return false; return true; }); diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 9293831fdcf..13a1510ebd6 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -391,7 +391,7 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input, continue; const auto mimeTypes = Utils::mimeTypesForFileName(si.path); for (const auto &mime : mimeTypes) - if (mime.name() == headerMimeType) + if (mime.inherits(headerMimeType)) sources.push_back(sourceDir.absoluteFilePath(si.path)); } } diff --git a/src/plugins/cmakeprojectmanager/presetsparser.cpp b/src/plugins/cmakeprojectmanager/presetsparser.cpp index eed174e2b42..5ebd17fd630 100644 --- a/src/plugins/cmakeprojectmanager/presetsparser.cpp +++ b/src/plugins/cmakeprojectmanager/presetsparser.cpp @@ -82,7 +82,7 @@ std::optional parseCondition(const QJsonValue &jsonVa if (type == "const") { condition->type = type; - condition->constValue = object.value("const").toBool(); + condition->constValue = object.value("value").toBool(); return condition; } @@ -215,12 +215,24 @@ bool parseConfigurePresets(const QJsonValue &jsonValue, item.key = cacheKey.toUtf8(); item.type = CMakeConfigItem::typeStringToType( cacheVariableObj.value("type").toString().toUtf8()); - item.value = cacheVariableObj.value("type").toString().toUtf8(); + item.value = cacheVariableObj.value("value").toString().toUtf8(); preset.cacheVariables.value() << item; } else { - preset.cacheVariables.value() - << CMakeConfigItem(cacheKey.toUtf8(), cacheValue.toString().toUtf8()); + if (cacheValue.isBool()) { + preset.cacheVariables.value() + << CMakeConfigItem(cacheKey.toUtf8(), + CMakeConfigItem::BOOL, + cacheValue.toBool() ? "ON" : "OFF"); + } else if (CMakeConfigItem::toBool(cacheValue.toString()).has_value()) { + preset.cacheVariables.value() + << CMakeConfigItem(cacheKey.toUtf8(), + CMakeConfigItem::BOOL, + cacheValue.toString().toUtf8()); + } else { + preset.cacheVariables.value() + << CMakeConfigItem(cacheKey.toUtf8(), cacheValue.toString().toUtf8()); + } } } diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.cpp b/src/plugins/coreplugin/locator/locatorsettingspage.cpp index 9940680aa25..0193a791c37 100644 --- a/src/plugins/coreplugin/locator/locatorsettingspage.cpp +++ b/src/plugins/coreplugin/locator/locatorsettingspage.cpp @@ -85,7 +85,7 @@ QVariant FilterItem::data(int column, int role) const return m_filter->shortcutString(); break; case FilterIncludedByDefault: - if (role == Qt::CheckStateRole || role == SortRole || role == Qt::EditRole) + if (role == Qt::CheckStateRole || role == SortRole) return m_filter->isIncludedByDefault() ? Qt::Checked : Qt::Unchecked; break; default: @@ -102,7 +102,7 @@ Qt::ItemFlags FilterItem::flags(int column) const if (column == FilterPrefix) return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable; if (column == FilterIncludedByDefault) - return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsUserCheckable; + return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable; return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 3e1927faeb7..6f7e22bacd2 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -397,7 +397,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) const Environment thisEnvironment = rc->environment(); const auto tab = std::find_if(m_runControlTabs.begin(), m_runControlTabs.end(), [&](const RunControlTab &tab) { - if (!tab.runControl || tab.runControl->isRunning()) + if (!tab.runControl || tab.runControl->isRunning() || tab.runControl->isStarting()) return false; return thisCommand == tab.runControl->commandLine() && thisWorkingDirectory == tab.runControl->workingDirectory() diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 0575e2dbbba..a5b7687a2ac 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -505,7 +505,6 @@ QmlJSEditorDocumentPrivate::QmlJSEditorDocumentPrivate(QmlJSEditorDocument *pare this, &QmlJSEditorDocumentPrivate::updateOutlineModel); modelManager->updateSourceFiles(Utils::FilePaths({parent->filePath()}), false); - settingsChanged(); } QmlJSEditorDocumentPrivate::~QmlJSEditorDocumentPrivate() @@ -818,6 +817,8 @@ QmlJSEditorDocument::QmlJSEditorDocument(Utils::Id id) setId(id); connect(this, &TextEditor::TextDocument::tabSettingsChanged, d, &Internal::QmlJSEditorDocumentPrivate::invalidateFormatterCache); + connect(this, &TextEditor::TextDocument::openFinishedSuccessfully, + d, &Internal::QmlJSEditorDocumentPrivate::settingsChanged); setSyntaxHighlighter(new QmlJSHighlighter(document())); setCodec(QTextCodec::codecForName("UTF-8")); // qml files are defined to be utf-8 setIndenter(new Internal::Indenter(document())); diff --git a/src/plugins/qtsupport/examplesparser.cpp b/src/plugins/qtsupport/examplesparser.cpp index bdde8e66a0f..5fd3161777c 100644 --- a/src/plugins/qtsupport/examplesparser.cpp +++ b/src/plugins/qtsupport/examplesparser.cpp @@ -211,9 +211,9 @@ static QList parseTutorials(QXmlStreamReader *reader, const FileP item->type = Tutorial; QXmlStreamAttributes attributes = reader->attributes(); item->name = attributes.value(QLatin1String("name")).toString(); - item->projectPath = projectsOffset - / attributes.value(QLatin1String("projectPath")).toString(); - item->hasSourceCode = !item->projectPath.isEmpty(); + const QString projectPath = attributes.value(QLatin1String("projectPath")).toString(); + item->projectPath = projectsOffset / projectPath; + item->hasSourceCode = !projectPath.isEmpty(); item->imageUrl = Utils::StyleHelper::dpiSpecificImageFile( attributes.value(QLatin1String("imageUrl")).toString()); QPixmapCache::remove(item->imageUrl); diff --git a/src/plugins/saferenderer/wizards/qsrapp/main.cpp.tpl b/src/plugins/saferenderer/wizards/qsrapp/main.cpp.tpl index 4f36c6f6fa3..c491bee9aeb 100644 --- a/src/plugins/saferenderer/wizards/qsrapp/main.cpp.tpl +++ b/src/plugins/saferenderer/wizards/qsrapp/main.cpp.tpl @@ -28,23 +28,23 @@ int main(int argc, char *argv[]) static SafeRenderer::QSafeLayoutResourceReader layout("/layoutData/main/main.srl"); #if defined(USE_OUTPUTVERIFIER) - static OutputVerifier outputVerifier; + static SafeRenderer::OutputVerifier outputVerifier; #if defined(HOST_BUILD) //In host environment the TestVerifier must be explicitly created. //In OpeWFD adaptation the MISRVerifier instance is created in the SafeWindow adaptation. - static TestVerifier testVerifier(outputVerifier); + static SafeRenderer::TestVerifier testVerifier(outputVerifier); #endif - SafeWindow telltaleWindow(layout.size(), QSafePoint(0U, 0U), outputVerifier); + SafeRenderer::SafeWindow telltaleWindow(layout.size(), SafeRenderer::QSafePoint(0U, 0U), outputVerifier); #else - SafeWindow telltaleWindow(layout.size(), QSafePoint(0U, 0U)); + SafeRenderer::SafeWindow telltaleWindow(layout.size(), SafeRenderer::QSafePoint(0U, 0U)); #endif static SafeRenderer::StateManager stateManager(telltaleWindow, layout); telltaleWindow.requestUpdate(); //Request is required because eventHandler is not running yet. #if defined(USE_OUTPUTVERIFIER) - EventHandler msgHandler(stateManager, telltaleWindow, outputVerifier); + SafeRenderer::EventHandler msgHandler(stateManager, telltaleWindow, outputVerifier); #else - EventHandler msgHandler(stateManager, telltaleWindow); + SafeRenderer::EventHandler msgHandler(stateManager, telltaleWindow); #endif #if defined(HOST_BUILD) diff --git a/src/plugins/texteditor/codestyleeditor.cpp b/src/plugins/texteditor/codestyleeditor.cpp index 6aaf5ae9483..ac75f1ad6d3 100644 --- a/src/plugins/texteditor/codestyleeditor.cpp +++ b/src/plugins/texteditor/codestyleeditor.cpp @@ -108,6 +108,9 @@ void CodeStyleEditor::finish() { if (m_widget) m_widget->finish(); + + if (m_additionalGlobalSettingsWidget) + m_additionalGlobalSettingsWidget->finish(); } } // TextEditor diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 7e50d469271..17cabc38911 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -2913,9 +2913,9 @@ void TextEditorWidget::insertCodeSnippet(const QTextCursor &cursor_arg, d->m_document->autoIndent(cursor); cursor.endEditBlock(); - const QColor &occurrencesColor + const QColor occurrencesColor = textDocument()->fontSettings().toTextCharFormat(C_OCCURRENCES).background().color(); - const QColor &renameColor + const QColor renameColor = textDocument()->fontSettings().toTextCharFormat(C_OCCURRENCES_RENAME).background().color(); for (const CursorPart &part : cursorParts) { diff --git a/src/plugins/texteditor/texteditoroverlay.cpp b/src/plugins/texteditor/texteditoroverlay.cpp index bf320549de1..52ab8709de6 100644 --- a/src/plugins/texteditor/texteditoroverlay.cpp +++ b/src/plugins/texteditor/texteditoroverlay.cpp @@ -134,8 +134,10 @@ QPainterPath TextEditorOverlay::createSelectionPath(const QTextCursor &begin, co int x = line.cursorToX(pos); lineRect.setLeft(x - borderWidth); lineRect.setRight(x + borderWidth); + lineRect.setBottom(lineRect.bottom() + borderWidth); QPainterPath path; path.addRect(lineRect); + path.translate(offset); return path; } @@ -250,6 +252,8 @@ void TextEditorOverlay::paintSelection(QPainter *painter, return; QPainterPath path = createSelectionPath(begin, end, clip); + if (path.isEmpty()) + return; painter->save(); QColor penColor = fg; @@ -305,6 +309,8 @@ void TextEditorOverlay::fillSelection(QPainter *painter, return; QPainterPath path = createSelectionPath(begin, end, clip); + if (path.isEmpty()) + return; painter->save(); painter->translate(-.5, -.5); diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp index 4a8320de57b..37be854d9b9 100644 --- a/src/plugins/texteditor/textmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -133,7 +133,7 @@ void TextMark::paintAnnotation(QPainter &painter, const QColor &markColor = annotationColor(); const FontSettings &fontSettings = m_baseTextDocument->fontSettings(); - const AnnotationColors &colors = AnnotationColors::getAnnotationColors( + const AnnotationColors colors = AnnotationColors::getAnnotationColors( markColor.isValid() ? markColor : painter.pen().color(), fontSettings.toTextCharFormat(C_TEXT).background().color()); diff --git a/src/plugins/valgrind/callgrindvisualisation.cpp b/src/plugins/valgrind/callgrindvisualisation.cpp index f049a92e354..4120dc53de2 100644 --- a/src/plugins/valgrind/callgrindvisualisation.cpp +++ b/src/plugins/valgrind/callgrindvisualisation.cpp @@ -155,7 +155,7 @@ void FunctionGraphicsItem::paint(QPainter *painter, painter->save(); QRectF rect = this->rect(); - const QColor &color = brush().color(); + const QColor color = brush().color(); if (option->state & QStyle::State_Selected) { QLinearGradient gradient(0, 0, rect.width(), 0); gradient.setColorAt(0, color.darker(100)); diff --git a/src/shared/qbs b/src/shared/qbs index 978448ddfe8..e002680feb4 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 978448ddfe8aac9c4cc895f6c93429e0f9f689bc +Subproject commit e002680feb415ee7d26e3a31d70afeef0d50dea2 diff --git a/tests/system/suite_CSUP/tst_CSUP03/test.py b/tests/system/suite_CSUP/tst_CSUP03/test.py index 8667f3c2ac9..4e6f3e20995 100644 --- a/tests/system/suite_CSUP/tst_CSUP03/test.py +++ b/tests/system/suite_CSUP/tst_CSUP03/test.py @@ -50,10 +50,6 @@ def main(): } for useClang in [False, True]: with TestSection(getCodeModelString(useClang)): - if (useClang and platform.system() in ('Windows', 'Microsoft') - and JIRA.isBugStillOpen(18607)): - test.warning("Skipping unstable tests on Windows", "See QTCREATORBUG-18607") - continue if not startCreatorVerifyingClang(useClang): continue projectName = createNewNonQtProject(tempDir(), "project-csup03", diff --git a/tests/system/suite_CSUP/tst_CSUP06/test.py b/tests/system/suite_CSUP/tst_CSUP06/test.py index 56e934db407..7682d1a6723 100644 --- a/tests/system/suite_CSUP/tst_CSUP06/test.py +++ b/tests/system/suite_CSUP/tst_CSUP06/test.py @@ -42,8 +42,14 @@ def performAutoCompletionTest(editor, lineToStartRegEx, linePrefix, testFunc, *f def checkIncludeCompletion(editor, isClangCodeModel): test.log("Check auto-completion of include statements.") # define special handlings - noProposal = ["detail/hea"] + noProposal = [] specialHandling = {"ios":"iostream", "cstd":"cstdio"} + if isClangCodeModel: + specialHandling["QDe"] = "QDebug" + for i in specialHandling.keys(): + specialHandling[i] = " %s>" % specialHandling[i] + else: + noProposal += ["detail/hea"] # define test function to perform the _real_ auto completion test on the current line def testIncl(currentLine, *args): @@ -69,25 +75,24 @@ def checkIncludeCompletion(editor, isClangCodeModel): def checkSymbolCompletion(editor, isClangCodeModel): test.log("Check auto-completion of symbols.") # define special handlings - expectedSuggestion = {"in":["internal", "int", "INT_MAX", "INT_MIN"], + expectedSuggestion = {"in":["internal", "int", "intmax_t"], "Dum":["Dummy", "dummy"], "Dummy::O":["ONE","one"], - "dummy.":["foo", "bla", "ONE", "one", "PI", "sfunc", "v1", "v2", "v3"], + "dummy.":["one", "ONE", "PI", "v1", "v2", "v3"], "dummy.o":["one", "ONE"], "Dummy::In":["Internal", "INT"], "Dummy::Internal::":["DOUBLE", "one"] } missing = ["Dummy::s", "Dummy::P", "dummy.b", "dummy.bla(", "internal.o", "freefunc2"] - expectedResults = {"dummy.":"dummy.foo(", "Dummy::s":"Dummy::sfunc()", + expectedResults = {"Dummy::s":"Dummy::sfunc()", "Dummy::P":"Dummy::PI", "dummy.b":"dummy.bla(", "dummy.bla(":"dummy.bla(", "internal.o":"internal.one", "freefunc2":"freefunc2(", "using namespace st":"using namespace std", "afun":"afunc()"} if isClangCodeModel: - missing.remove("internal.o") - expectedSuggestion["in"] = ["internal", "int"] # QTCREATORBUG-22728 - expectedSuggestion["internal.o"] = ["one", "operator="] + missing = ["dummy.bla("] + expectedSuggestion["internal.o"] = ["one"] if platform.system() in ('Microsoft', 'Windows'): expectedSuggestion["using namespace st"] = ["std", "stdext"] else: - expectedSuggestion["using namespace st"] = ["std", "struct ", "struct template"] + expectedSuggestion["using namespace st"] = ["std", "struct", "struct template"] else: expectedSuggestion["using namespace st"] = ["std", "st"] # define test function to perform the _real_ auto completion test on the current line @@ -101,27 +106,25 @@ def checkSymbolCompletion(editor, isClangCodeModel): found = [] if propShown: proposalListView = waitForObject(':popupFrame_Proposal_QListView') - found = dumpItems(proposalListView.model()) + found = [i.strip() for i in dumpItems(proposalListView.model())] diffShownExp = set(expectedSug.get(symbol, [])) - set(found) if not test.verify(len(diffShownExp) == 0, "Verify if all expected suggestions could be found"): test.log("Expected but not found suggestions: %s" % diffShownExp, "%s | %s" % (expectedSug[symbol], str(found))) # select first item of the expected suggestion list - doubleClickItem(':popupFrame_Proposal_QListView', expectedSug.get(symbol, found)[0], + suggestionToClick = expectedSug.get(symbol, found)[0] + if isClangCodeModel: + suggestionToClick = " " + suggestionToClick + doubleClickItem(':popupFrame_Proposal_QListView', suggestionToClick, 5, 5, 0, Qt.LeftButton) changedLine = str(lineUnderCursor(editor)).strip() if symbol in expectedRes: exp = expectedRes[symbol] else: exp = (symbol[:max(symbol.rfind(":"), symbol.rfind(".")) + 1] - + expectedSug.get(symbol, found)[0]) - if isClangCodeModel and changedLine != exp and JIRA.isBugStillOpen(15483): - test.xcompare(changedLine, exp, "Verify completion matches (QTCREATORBUG-15483).") - test.verify(changedLine.startswith(exp.replace("(", "").replace(")", "")), - "Verify completion starts with expected string.") - else: - test.compare(changedLine, exp, "Verify completion matches.") + + expectedSug.get(symbol, found)[0]).strip() + test.compare(changedLine, exp, "Verify completion matches.") performAutoCompletionTest(editor, ".*Complete symbols.*", "//", testSymb, missing, expectedSuggestion, expectedResults) @@ -143,6 +146,10 @@ def main(): return editor = getEditorForFileSuffix("main.cpp") if editor: + if useClang: + test.log("Wait for parsing to finish...") + progressBarWait(15000) + test.log("Parsing done.") checkIncludeCompletion(editor, useClang) checkSymbolCompletion(editor, useClang) invokeMenuItem('File', 'Revert "main.cpp" to Saved') diff --git a/tests/system/suite_HELP/tst_HELP04/test.py b/tests/system/suite_HELP/tst_HELP04/test.py index e4c0500d234..3fd63309ad3 100644 --- a/tests/system/suite_HELP/tst_HELP04/test.py +++ b/tests/system/suite_HELP/tst_HELP04/test.py @@ -87,8 +87,7 @@ def main(): type(resultWidget, "") waitFor("__getUrl__() != url or selText != __getSelectedText__()", 20000) verifySelection(searchKeyword) - if not (searchKeyword == "QODBC" and JIRA.isBugStillOpen(10331)): - verifyUrl(urlDictionary[searchKeyword]) + verifyUrl(urlDictionary[searchKeyword]) else: test.verify(waitFor("noMatch in " "str(resultWidget.plainText)", 1000), diff --git a/tests/system/suite_QMLS/tst_QMLS04/test.py b/tests/system/suite_QMLS/tst_QMLS04/test.py index 351b59ac638..2c96939151d 100644 --- a/tests/system/suite_QMLS/tst_QMLS04/test.py +++ b/tests/system/suite_QMLS/tst_QMLS04/test.py @@ -48,14 +48,12 @@ def main(): pass # open MyComponent.qml file for verification docOpened = openDocument(myCompTE) - if JIRA.isBugStillOpen(28985): - test.xverify(docOpened, "Was MyComponent.qml properly generated in project explorer?") - saveAndExit() - return - if not test.verify(docOpened, "Was MyComponent.qml properly generated in project explorer?"): - test.fatal("Could not open MyComponent.qml.") - saveAndExit() - return + # Work around QTCREATORBUG-28985 + test.xverify(docOpened, "Was MyComponent.qml properly generated in project explorer?") + saveAndExit() + return + # The workaround will be removed in master branch + # Following dead code left in intentionally to still allow merging forward changes in it. editorArea = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget") codeText = str(editorArea.plainText) # there should be Text item in new file diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 866720b27b8..f710dd1375a 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -275,7 +275,9 @@ def __getCDB__(): "C:\\Program Files\\Windows Kits\\8.1\\Debuggers\\x86", "C:\\Program Files\\Windows Kits\\8.1\\Debuggers\\x64", "C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86", - "C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64"] + "C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64", + "C:\\Program Files\\Windows Kits\\10\\Debuggers\\x86", + "C:\\Program Files\\Windows Kits\\10\\Debuggers\\x64"] for cdbPath in possibleLocations: cdb = os.path.join(cdbPath, "cdb.exe") if os.path.exists(cdb):