diff --git a/doc/qtcreator/images/qtcreator-configure-project.webp b/doc/qtcreator/images/qtcreator-configure-project.webp new file mode 100644 index 00000000000..6f77d3a2a95 Binary files /dev/null and b/doc/qtcreator/images/qtcreator-configure-project.webp differ diff --git a/doc/qtcreator/images/qtcreator-open-project-kits.png b/doc/qtcreator/images/qtcreator-open-project-kits.png deleted file mode 100644 index 8434389fa11..00000000000 Binary files a/doc/qtcreator/images/qtcreator-open-project-kits.png and /dev/null differ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc index e1d998999e1..600b8f30791 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -50,10 +50,17 @@ the \uicontrol \B2Q tag (commercial only) in the search field (4) to list examples that you can run on \B2Q devices. + \li In \uicontrol {Configure Project}, select + \l{glossary-buildandrun-kit}{kits} for building the example for the + target platforms. + + \image qtcreator-configure-project.webp {Configure Project view} + + \li Select \uicontrol {Configure Project}. + \li To check that you can compile and link the application code for a - device, click the \uicontrol {Kit Selector} and select a - \l{glossary-buildandrun-kit}{kit} for the - device. + device, click the \uicontrol {Kit Selector} and select the kit for + the device. \image qtcreator-examples-kit-selector.webp {Selecting a kit to build with} @@ -61,7 +68,7 @@ automatically detected the installed kit. If you cannot see any kits, see \l{Add kits}. - \li Click \inlineimage icons/run_small.png + \li Select \inlineimage icons/run_small.png (\uicontrol Run) to build and run the application. \li To see the compilation progress, press \key{Alt+4} to open @@ -78,7 +85,7 @@ \endlist - \sa {Add compilers}, {Add kits}, {Add Qt versions}, + \sa {Manage Kits}{How To: Manage Kits}, {Open projects}, {Developing for Android}, {Developing for iOS}, {Compile Output}, {\B2Q: Documentation}, {Qt Design Studio Manual} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc index f631e673890..66b69a573fe 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc @@ -63,15 +63,15 @@ To re-configure projects: \list 1 - \li In the \uicontrol {Configure Project} tab, select + \li In \uicontrol {Configure Project}, select \l{glossary-buildandrun-kit}{kits} for building and running your project. - \image qtcreator-open-project-kits.png {Configure Project tab} + \image qtcreator-configure-project.webp {Configure Project view} \li Select \uicontrol {Configure Project}. \endlist - The \uicontrol {Configure Project} tab displays a list of kits that you - install on the development PC and configure in \preferences > \uicontrol Kits. + \uicontrol {Configure Project} shows a list of kits that you + install on the computer and configure in \preferences > \uicontrol Kits. Even if you do not intend to build the project, the C++ and QML code models need a Qt version and compiler to offer code completion. To specify them, diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc index 443aa40be45..3af3c6769b4 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc @@ -35,11 +35,29 @@ Set workspace details in \uicontrol {P4 user}, \uicontrol {P4 client}, and \uicontrol {P4 port}. + \section1 Using Configuration Files + To specify the details individually for several projects, use configuration - files instead. Create a \c {p4config.txt} configuration file for each - project in the top level project directory, and run - \c{p4 set P4CONFIG=p4config.txt} once. You must deselect the - \uicontrol {Environment Variables} check box. + files: + + \list 1 + \li Create a \c {p4config.txt} configuration file for each project in the + top level project directory. + \li Go to \preferences > \uicontrol {Version Control} > + \uicontrol Perforce. + \li Clear \uicontrol {Environment Variables}. + \li Run the following command from the command line once: + \list + \li On Windows: + \badcode + p4 set P4CONFIG=p4config.txt + \endcode + \li On Linux + \badcode + export P4CONFIG= + \endcode + \endlist + \endlist \section1 Editing Files diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index f4a86a41d41..0c6aeb2dff3 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -50,8 +50,9 @@ */ /*! - \fn void ExtensionSystem::PluginView::pluginSettingsChanged(ExtensionSystem::PluginSpec *spec) - The settings for the plugin list entry corresponding to \a spec changed. + \fn void ExtensionSystem::PluginView::pluginsChanged(const QSet &spec, bool enabled) + The value of \a enabled for the plugin list entry corresponding to \a spec + changed. */ using namespace Utils; diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 6ef84c119e6..b3ae0e278f4 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -1416,7 +1416,10 @@ FilePath FilePathAspect::operator()() const FilePath FilePathAspect::expandedValue() const { - return FilePath::fromUserInput(TypedAspect::value()); + const auto value = TypedAspect::value(); + if (!value.isEmpty() && d->m_expanderProvider) + return FilePath::fromUserInput(d->m_expanderProvider()->expand(value)); + return FilePath::fromUserInput(value); } QString FilePathAspect::value() const diff --git a/src/libs/utils/externalterminalprocessimpl.cpp b/src/libs/utils/externalterminalprocessimpl.cpp index 10dcfa4d3ae..693905bddc0 100644 --- a/src/libs/utils/externalterminalprocessimpl.cpp +++ b/src/libs/utils/externalterminalprocessimpl.cpp @@ -190,8 +190,6 @@ expected_str ProcessStubCreator::startStubProcess(const ProcessSetupData process->setEnvironment( setupData.m_environment.appliedToEnvironment(Environment::systemEnvironment())); - process->setEnvironment(setupData.m_environment); - process->start(); process->waitForStarted(); if (process->error() != QProcess::UnknownError) { diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 317b72722b5..8fc19e34359 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -1002,7 +1002,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates() Process keytoolProc; keytoolProc.setCommand({androidConfig().keytoolPath(), params}); using namespace std::chrono_literals; - keytoolProc.runBlocking(30s, EventLoopMode::On); + keytoolProc.runBlocking(30s); if (keytoolProc.result() > ProcessResult::FinishedWithError) QMessageBox::critical(nullptr, Tr::tr("Error"), Tr::tr("Failed to run keytool.")); else diff --git a/src/plugins/android/androidcreatekeystorecertificate.cpp b/src/plugins/android/androidcreatekeystorecertificate.cpp index 77aed2a6ad4..9cd6d7ee4ae 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.cpp +++ b/src/plugins/android/androidcreatekeystorecertificate.cpp @@ -275,7 +275,7 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted() Process genKeyCertProc; genKeyCertProc.setCommand(command); using namespace std::chrono_literals; - genKeyCertProc.runBlocking(15s, EventLoopMode::On); + genKeyCertProc.runBlocking(15s); if (genKeyCertProc.result() != ProcessResult::FinishedWithSuccess) { QMessageBox::critical(this, Tr::tr("Error"), diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 5128f761a00..a2631f0c536 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -614,7 +614,7 @@ bool checkKeystorePassword(const FilePath &keystorePath, const QString &keystore "--storepass", keystorePasswd}); Process proc; proc.setCommand(cmd); - proc.runBlocking(10s, EventLoopMode::On); + proc.runBlocking(10s); return proc.result() == ProcessResult::FinishedWithSuccess; } @@ -631,7 +631,7 @@ bool checkCertificatePassword(const FilePath &keystorePath, const QString &keyst Process proc; proc.setCommand({androidConfig().keytoolPath(), arguments}); - proc.runBlocking(10s, EventLoopMode::On); + proc.runBlocking(10s); return proc.result() == ProcessResult::FinishedWithSuccess; } @@ -644,7 +644,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor Process proc; proc.setCommand({androidConfig().keytoolPath(), arguments}); - proc.runBlocking(10s, EventLoopMode::On); + proc.runBlocking(10s); return proc.result() == ProcessResult::FinishedWithSuccess; } diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 4134da09e7c..9027e487891 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -308,7 +308,8 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, std::optional dllName; if (buildDir.osType() == OsTypeWindows && (f.role == "libraries")) { - part = FilePath::fromUserInput(part).fileName(); + const auto partAsFilePath = FilePath::fromUserInput(part); + part = partAsFilePath.fileName(); // Skip object libraries on Windows. This case can happen with static qml plugins if (part.endsWith(".obj") || part.endsWith(".o")) @@ -322,12 +323,15 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, } // MinGW has libQt6Core.a -> Qt6Core.dll + // but libFoo.dll.a was already handled above const QString mingwPrefix("lib"); - const QString mingwSuffix(".a"); - if (part.startsWith(mingwPrefix) && part.endsWith(mingwSuffix)) - dllName = part.chopped(mingwSuffix.length()) + const QString mingwSuffix("a"); + const QString completeSuffix = partAsFilePath.completeSuffix(); + if (part.startsWith(mingwPrefix) && completeSuffix == mingwSuffix) { + dllName = part.chopped(mingwSuffix.length() + 1/*the '.'*/) .sliced(mingwPrefix.length()) .append(".dll"); + } } if (!tmp.isEmpty() && tmp.isDir()) { diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index e9d2ce10d33..cc9720f0060 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1480,6 +1480,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) { @@ -2777,7 +2778,6 @@ void EditorManager::slotCloseCurrentEditorOrDocument() { if (!d->m_currentEditor) return; - addCurrentPositionToNavigationHistory(); d->closeEditorOrDocument(d->m_currentEditor); } diff --git a/src/plugins/coreplugin/find/ifindfilter.cpp b/src/plugins/coreplugin/find/ifindfilter.cpp index 704f827bf83..49a891e659f 100644 --- a/src/plugins/coreplugin/find/ifindfilter.cpp +++ b/src/plugins/coreplugin/find/ifindfilter.cpp @@ -30,7 +30,7 @@ using namespace Utils; and \uicontrol {Files in File System} where the user provides a directory and file patterns to search. - \image qtcreator-search-filesystem.png + \image qtcreator-search-reg-exp.webp {Search Results view with search criteria} To make your find scope available to the user, you need to implement this class, and register an instance of your subclass in the plugin manager. @@ -38,7 +38,7 @@ using namespace Utils; A common way to present the search results to the user, is to use the shared \uicontrol{Search Results} pane. - \image qtcreator-search-results.webp {Search Results view} + \image qtcreator-search-results-reg-exp.webp {Search Results view with search results} If you want to implement a find filter that is doing a file based text search, you should use \l Core::BaseTextFind, which already implements all @@ -178,13 +178,13 @@ using namespace Utils; */ /*! - \fn void Core::IFindFilter::writeSettings(QSettings *settings) + \fn void Core::IFindFilter::writeSettings(Utils::QtcSettings *settings) Called at shutdown to write the state of the additional options for this find filter to the \a settings. */ /*! - \fn void Core::IFindFilter::readSettings(QSettings *settings) + \fn void Core::IFindFilter::readSettings(Utils::QtcSettings *settings) Called at startup to read the state of the additional options for this find filter from the \a settings. */ diff --git a/src/plugins/coreplugin/find/searchresultwindow.cpp b/src/plugins/coreplugin/find/searchresultwindow.cpp index 8412a57d707..eea0c43d4e6 100644 --- a/src/plugins/coreplugin/find/searchresultwindow.cpp +++ b/src/plugins/coreplugin/find/searchresultwindow.cpp @@ -288,10 +288,13 @@ using namespace Core::Internal; This enum type specifies whether the search results should be sorted or ordered: - \value AddSorted - The search results are sorted. + \value AddSortedByContent + The search results are sorted alphabetically. + \value AddSortedByPosition + The search results are sorted by the search results' reported line + numbers. \value AddOrdered - The search results are ordered. + The search results are ordered as they are reported. */ /*! @@ -331,7 +334,7 @@ using namespace Core::Internal; \brief The SearchResultWindow class is the implementation of a commonly shared \uicontrol{Search Results} output pane. - \image qtcreator-search-results.webp {Search Results view} + \image qtcreator-search-results-reg-exp.webp {Search Results view with search results} Whenever you want to show the user a list of search results, or want to present UI for a global search and replace, use the single instance diff --git a/src/plugins/designer/qtdesignerformclasscodegenerator.cpp b/src/plugins/designer/qtdesignerformclasscodegenerator.cpp index d935079cf43..677494658b4 100644 --- a/src/plugins/designer/qtdesignerformclasscodegenerator.cpp +++ b/src/plugins/designer/qtdesignerformclasscodegenerator.cpp @@ -103,7 +103,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr); headerStr << "#endif\n"; } else { - Utils::writeIncludeFileDirective("QtGui/" + formBaseClass, true, headerStr); + Utils::writeIncludeFileDirective("QtWidgets/" + formBaseClass, true, headerStr); } } else { Utils::writeIncludeFileDirective(formBaseClass, true, headerStr); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 586d3d61f2d..dd0108b7b9e 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1531,7 +1531,8 @@ private: const QString sshCmdLine = ProcessArgs::joinArgs( QStringList{SshSettings::sshFilePath().toUserOutput()} << fullConnectionOptions(), OsTypeLinux); - QStringList options{"-e", sshCmdLine, m_setup.m_rsyncFlags}; + QStringList options{"-e", sshCmdLine}; + options << ProcessArgs::splitArgs(m_setup.m_rsyncFlags, HostOsInfo::hostOs()); if (!m_batches.isEmpty()) { // NormalRun const auto batchIt = m_batches.begin(); diff --git a/src/shared/qbs b/src/shared/qbs index 488fbe40e86..fc4dec2f6a8 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 488fbe40e86602d06e568a1749277387fd4a565e +Subproject commit fc4dec2f6a82c11ff7fe1aac2408d83dbbd1a9c5 diff --git a/tests/system/suite_tools/tst_designer_autocomplete/test.py b/tests/system/suite_tools/tst_designer_autocomplete/test.py index b378407f812..c77d4b5f180 100644 --- a/tests/system/suite_tools/tst_designer_autocomplete/test.py +++ b/tests/system/suite_tools/tst_designer_autocomplete/test.py @@ -48,12 +48,15 @@ def main(): snooze(1) type(editor, ">") snooze(1) + proposalExists = lambda: object.exists(':popupFrame_TextEditor::GenericProposalWidget') nativeType("%s" % buttonName[0]) - test.verify(waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500), - "Verify that GenericProposalWidget is being shown.") - nativeType("") - test.verify(waitFor('str(lineUnderCursor(editor)).strip() == "ui->%s" % buttonName', 1000), - 'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), "ui->%s" % buttonName)) + if test.verify(waitFor(proposalExists, 4000), + "Verify that GenericProposalWidget is being shown."): + nativeType("") + lineCorrect = lambda: str(lineUnderCursor(editor)).strip() == "ui->%s" % buttonName + test.verify(waitFor(lineCorrect, 1000), + ('Comparing line "%s" to expected "%s"' + % (lineUnderCursor(editor), "ui->%s" % buttonName))) type(editor, "") # Delete line selectFromLocator("mainwindow.ui") saveAndExit()