Merge remote-tracking branch 'origin/15.0'

Change-Id: Ia9b2ce1abe8c34747b3ee27e1e89b5f4a2fdc2b0
This commit is contained in:
Eike Ziller
2025-01-10 14:20:37 +01:00
10 changed files with 202 additions and 25 deletions

155
dist/changelog/changes-15.0.1.md vendored Normal file
View File

@@ -0,0 +1,155 @@
Qt Creator 15.0.1
=================
Qt Creator version 15.0.1 contains bug fixes and new features.
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 or view online at
<https://code.qt.io/cgit/qt-creator/qt-creator.git/log/?id=v15.0.0..v15.0.1>
General
-------
* Fixed the loading of plugins from the user-specific plugin directory
* Fixed a crash when selecting a dynamic library directly in the plugin
installation wizard
Help
----
* Fixed opening links to Academy
([QTCREATORBUG-32134](https://bugreports.qt.io/browse/QTCREATORBUG-32134))
Editing
-------
* Fixed a crash when editors are closed while the document switching window
(`Ctrl+Tab`) is open
* Fixed a missing re-highlighting after the color scheme is changed
([QTCREATORBUG-32116](https://bugreports.qt.io/browse/QTCREATORBUG-32116))
### C++
* Fixed the `Move Definition` refactoring action for template methods
([QTCREATORBUG-31678](https://bugreports.qt.io/browse/QTCREATORBUG-31678))
* Clangd
* Updated prebuilt binaries to LLVM 19.1.6
* Fixed a potential crash when canceling indexing
* Built-in
* Fixed a wrong warning for range-based `for` loops
([QTCREATORBUG-32043](https://bugreports.qt.io/browse/QTCREATORBUG-32043))
### QML
* qmlls
* Turned off by default because of issues with QML modules
* Fixed that triggering refactoring actions was not available with
shortcut and Locator
([QTCREATORBUG-31977](https://bugreports.qt.io/browse/QTCREATORBUG-31977))
* Fixed that auto-completion sometimes did not appear
([QTCREATORBUG-32013](https://bugreports.qt.io/browse/QTCREATORBUG-32013))
* Fixed that a client handler could be created for empty executable paths
Projects
--------
* Fixed the GitHub action created by the Qt Creator plugin wizard
([QTCREATORBUG-32090](https://bugreports.qt.io/browse/QTCREATORBUG-32090))
### CMake
* Fixed that user-defined `UTILITY` targets were missing from Locator
([QTCREATORBUG-32080](https://bugreports.qt.io/browse/QTCREATORBUG-32080))
* Fixed a potential crash with CMake Presets
* Fixed an issue after updating MSVC
([QTCREATORBUG-32165](https://bugreports.qt.io/browse/QTCREATORBUG-32165))
* Fixed that `CMakeLists.txt` could not be found when adding files when
the `FOLDER` property was used
([QTCREATORBUG-32194](https://bugreports.qt.io/browse/QTCREATORBUG-32194))
* Fixed that a rebuild of an imported project could be forced
([QTCREATORBUG-32196](https://bugreports.qt.io/browse/QTCREATORBUG-32196))
* Fixed an issue with watching for external CMake changes
([QTCREATORBUG-31536](https://bugreports.qt.io/browse/QTCREATORBUG-31536))
* Conan
* Fixed the loading of projects that specify a `CMakeDeps` generator
([QTCREATORBUG-32076](https://bugreports.qt.io/browse/QTCREATORBUG-32076))
Debugging
---------
* Fixed a crash when enabling or disabling all breakpoints with the context menu
Analyzer
--------
### Clang
* Clang-Tidy
* Fixed that the required compilation database was not created
([QTCREATORBUG-32098](https://bugreports.qt.io/browse/QTCREATORBUG-32098))
* Fixed an issue with deselecting checks
([QTCREATORBUG-32147](https://bugreports.qt.io/browse/QTCREATORBUG-32147))
### Axivion
* Fixed that settings changes were automatically applied
([QTCREATORBUG-32078](https://bugreports.qt.io/browse/QTCREATORBUG-32078))
* Fixed the handling of projects with special characters in their name
([QTCREATORBUG-32091](https://bugreports.qt.io/browse/QTCREATORBUG-32091))
Terminal
--------
* Fixed the reuse of terminal tabs on macOS
([QTCREATORBUG-32197](https://bugreports.qt.io/browse/QTCREATORBUG-32197))
* Fixed a freeze when closing a terminal on Windows
([QTCREATORBUG-32192](https://bugreports.qt.io/browse/QTCREATORBUG-32192))
* Fixed that terminals automatically scrolled to the end also when not at the
bottom
([QTCREATORBUG-32167](https://bugreports.qt.io/browse/QTCREATORBUG-32167))
Version Control Systems
-----------------------
### Git
* Worked around a potential crash in the Branches view
Test Integration
----------------
### Boost
* Fixed a potential crash when accessing the C++ snapshot
Platforms
---------
### Android
* Fixed a potential crash after reloading packages
Credits for these changes go to:
--------------------------------
Alessandro Portale
André Pönitz
Andrii Semkiv
Christian Kandeler
Christian Stenger
Cristian Adam
David Schulz
Eike Ziller
Jaroslaw Kobus
Krzysztof Chrusciel
Leena Miettinen
Liu Zhangjian
Lukasz Papierkowski
Marcus Tillmanns
Orgad Shaneh
Patryk Stachniak
Robert Löhning
Sami Shalayel
Tim Blechmann
Ville Lavonius

View File

@@ -103,6 +103,8 @@ Test Integration
### Qt Test ### Qt Test
### Boost
### Catch2 ### Catch2
### CTest ### CTest

View File

@@ -907,6 +907,7 @@ void DebuggerRunTool::startDebugServerIfNeededAndContinueStartup()
} }
d->debuggerServerProc.setCommand(cmd); d->debuggerServerProc.setCommand(cmd);
d->debuggerServerProc.setWorkingDirectory(m_runParameters.inferior().workingDirectory);
connect(&d->debuggerServerProc, &Process::readyReadStandardOutput, connect(&d->debuggerServerProc, &Process::readyReadStandardOutput,
this, [this] { this, [this] {

View File

@@ -124,7 +124,7 @@ private:
void handleResponse(const DocumentUri &uri, const DocumentSymbolsResult &response); void handleResponse(const DocumentUri &uri, const DocumentSymbolsResult &response);
void updateTextCursor(const QModelIndex &proxyIndex); void updateTextCursor(const QModelIndex &proxyIndex);
void updateSelectionInTree(const QTextCursor &currentCursor); void updateSelectionInTree();
void onItemActivated(const QModelIndex &index); void onItemActivated(const QModelIndex &index);
QPointer<Client> m_client; QPointer<Client> m_client;
@@ -172,10 +172,7 @@ LanguageClientOutlineWidget::LanguageClientOutlineWidget(Client *client,
connect(&m_view, &QAbstractItemView::activated, connect(&m_view, &QAbstractItemView::activated,
this, &LanguageClientOutlineWidget::onItemActivated); this, &LanguageClientOutlineWidget::onItemActivated);
connect(m_editor->editorWidget(), &TextEditor::TextEditorWidget::cursorPositionChanged, connect(m_editor->editorWidget(), &TextEditor::TextEditorWidget::cursorPositionChanged,
this, [this](){ this, &LanguageClientOutlineWidget::updateSelectionInTree);
if (m_sync)
updateSelectionInTree(m_editor->textCursor());
});
setFocusProxy(&m_view); setFocusProxy(&m_view);
} }
@@ -187,8 +184,7 @@ QList<QAction *> LanguageClientOutlineWidget::filterMenuActions() const
void LanguageClientOutlineWidget::setCursorSynchronization(bool syncWithCursor) void LanguageClientOutlineWidget::setCursorSynchronization(bool syncWithCursor)
{ {
m_sync = syncWithCursor; m_sync = syncWithCursor;
if (m_sync && m_editor) updateSelectionInTree();
updateSelectionInTree(m_editor->textCursor());
} }
void LanguageClientOutlineWidget::setSorted(bool sorted) void LanguageClientOutlineWidget::setSorted(bool sorted)
@@ -238,9 +234,10 @@ void LanguageClientOutlineWidget::handleResponse(const DocumentUri &uri,
m_model.setInfo(*s, false); m_model.setInfo(*s, false);
else else
m_model.clear(); m_model.clear();
m_view.expandAll();
// The list has changed, update the current items // The list has changed, update the current items
updateSelectionInTree(m_editor->textCursor()); updateSelectionInTree();
} }
void LanguageClientOutlineWidget::updateTextCursor(const QModelIndex &proxyIndex) void LanguageClientOutlineWidget::updateTextCursor(const QModelIndex &proxyIndex)
@@ -268,8 +265,11 @@ static LanguageClientOutlineItem *itemForCursor(const LanguageClientOutlineModel
return result; return result;
} }
void LanguageClientOutlineWidget::updateSelectionInTree(const QTextCursor &currentCursor) void LanguageClientOutlineWidget::updateSelectionInTree()
{ {
if (!m_sync || !m_editor)
return;
const QTextCursor currentCursor = m_editor->editorWidget()->textCursor();
if (LanguageClientOutlineItem *item = itemForCursor(m_model, currentCursor)) { if (LanguageClientOutlineItem *item = itemForCursor(m_model, currentCursor)) {
const QModelIndex index = m_proxyModel.mapFromSource(m_model.indexForItem(item)); const QModelIndex index = m_proxyModel.mapFromSource(m_model.indexForItem(item));
m_view.setCurrentIndex(index); m_view.setCurrentIndex(index);

View File

@@ -96,7 +96,7 @@ private:
const QRegularExpression filePattern; const QRegularExpression filePattern;
QList<Task> m_tasks; QList<Task> m_tasks;
bool m_inTraceBack; bool m_inTraceBack = false;
}; };
// RunConfiguration // RunConfiguration

View File

@@ -177,7 +177,6 @@ void OutlineWidgetStack::restoreSettings(Utils::QtcSettings *settings, int posit
const Key baseKey = numberedKey("Outline.", position) + '.'; const Key baseKey = numberedKey("Outline.", position) + '.';
const QString baseKeyString = stringFromKey(baseKey); const QString baseKeyString = stringFromKey(baseKey);
bool syncWithEditor = true;
m_widgetSettings.clear(); m_widgetSettings.clear();
const QStringList longKeys = settings->allKeys(); const QStringList longKeys = settings->allKeys();
for (const QString &longKey : longKeys) { for (const QString &longKey : longKeys) {
@@ -187,13 +186,13 @@ void OutlineWidgetStack::restoreSettings(Utils::QtcSettings *settings, int posit
const QString key = longKey.mid(baseKeyString.length()); const QString key = longKey.mid(baseKeyString.length());
if (key == QLatin1String("SyncWithEditor")) { if (key == QLatin1String("SyncWithEditor")) {
syncWithEditor = settings->value(keyFromString(longKey)).toBool(); m_syncWithEditor = settings->value(keyFromString(longKey)).toBool();
continue; continue;
} }
m_widgetSettings.insert(key, settings->value(keyFromString(longKey))); m_widgetSettings.insert(key, settings->value(keyFromString(longKey)));
} }
m_toggleSync->setChecked(syncWithEditor); m_toggleSync->setChecked(m_syncWithEditor);
if (auto outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) if (auto outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget()))
outlineWidget->restoreSettings(m_widgetSettings); outlineWidget->restoreSettings(m_widgetSettings);
} }

View File

@@ -4066,9 +4066,9 @@ public:
, m_embed(embed) , m_embed(embed)
, m_textEditorWidget(textEditorWidget) , m_textEditorWidget(textEditorWidget)
{ {
QVBoxLayout *layout = new QVBoxLayout(this); m_layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0); updateContentMargins();
layout->addWidget(m_embed); m_layout->addWidget(m_embed);
setFixedWidth(m_textEditorWidget->width() - m_textEditorWidget->extraAreaWidth()); setFixedWidth(m_textEditorWidget->width() - m_textEditorWidget->extraAreaWidth());
setFixedHeight(m_embed->minimumSizeHint().height()); setFixedHeight(m_embed->minimumSizeHint().height());
@@ -4076,13 +4076,31 @@ public:
connect(m_textEditorWidget, &TextEditorWidget::resized, this, [this] { connect(m_textEditorWidget, &TextEditorWidget::resized, this, [this] {
setFixedWidth(m_textEditorWidget->width() - m_textEditorWidget->extraAreaWidth()); setFixedWidth(m_textEditorWidget->width() - m_textEditorWidget->extraAreaWidth());
}); });
m_textEditorWidget->viewport()->installEventFilter(this);
} }
int embedHeight() { return m_embed->sizeHint().height(); } int embedHeight() { return m_embed->sizeHint().height(); }
bool eventFilter(QObject *obj, QEvent *event) override
{
if (event->type() == QEvent::Resize)
updateContentMargins();
return QObject::eventFilter(obj, event);
}
private: private:
void updateContentMargins() {
bool verticalScrollBarVisible = m_textEditorWidget->verticalScrollBar()->isVisible();
int verticalScrollBarWidth = m_textEditorWidget->verticalScrollBar()->width();
// Value 4 here is the liitle space between extraArea (space with line numbers) and code.
m_layout->setContentsMargins(0, 0, 4 + (verticalScrollBarVisible ? verticalScrollBarWidth : 0), 0);
}
QWidget *m_embed; QWidget *m_embed;
TextEditorWidget *m_textEditorWidget; TextEditorWidget *m_textEditorWidget;
QVBoxLayout *m_layout;
}; };
EmbeddedWidgetInterface::~EmbeddedWidgetInterface() EmbeddedWidgetInterface::~EmbeddedWidgetInterface()

View File

@@ -90,8 +90,6 @@ void ValgrindToolRunner::stop()
m_isStopping = true; m_isStopping = true;
m_runner.stop(); m_runner.stop();
appendMessage(Tr::tr("Process terminated."), ErrorMessageFormat); appendMessage(Tr::tr("Process terminated."), ErrorMessageFormat);
m_progress.reportFinished();
reportStopped();
} }
QStringList ValgrindToolRunner::genericToolArguments() const QStringList ValgrindToolRunner::genericToolArguments() const

View File

@@ -61,6 +61,8 @@ static CommandLine valgrindCommand(const CommandLine &command,
class ValgrindProcessPrivate : public QObject class ValgrindProcessPrivate : public QObject
{ {
Q_OBJECT
public: public:
ValgrindProcessPrivate(ValgrindProcess *owner) ValgrindProcessPrivate(ValgrindProcess *owner)
: q(owner) : q(owner)
@@ -83,6 +85,9 @@ public:
bool m_useTerminal = false; bool m_useTerminal = false;
TaskTreeRunner m_taskTreeRunner; TaskTreeRunner m_taskTreeRunner;
signals:
void stopRequested();
}; };
Group ValgrindProcessPrivate::runRecipe() const Group ValgrindProcessPrivate::runRecipe() const
@@ -175,6 +180,7 @@ Group ValgrindProcessPrivate::runRecipe() const
connect(processPtr, &Process::readyReadStandardError, this, [this, processPtr] { connect(processPtr, &Process::readyReadStandardError, this, [this, processPtr] {
emit q->appendMessage(processPtr->readAllStandardError(), StdErrFormat); emit q->appendMessage(processPtr->readAllStandardError(), StdErrFormat);
}); });
connect(this, &ValgrindProcessPrivate::stopRequested, processPtr, &Process::stop);
}; };
const auto onProcessDone = [this, storage](const Process &process) { const auto onProcessDone = [this, storage](const Process &process) {
emit q->processErrorReceived(process.errorString(), process.error()); emit q->processErrorReceived(process.errorString(), process.error());
@@ -254,7 +260,7 @@ bool ValgrindProcess::start()
void ValgrindProcess::stop() void ValgrindProcess::stop()
{ {
d->m_taskTreeRunner.reset(); emit d->stopRequested();
} }
bool ValgrindProcess::runBlocking() bool ValgrindProcess::runBlocking()
@@ -275,3 +281,5 @@ bool ValgrindProcess::runBlocking()
} }
} // namespace Valgrind } // namespace Valgrind
#include "valgrindprocess.moc"

View File

@@ -30,12 +30,8 @@ def main():
# invoke QML parsing # invoke QML parsing
invokeMenuItem("Tools", "QML/JS", "Run Checks") invokeMenuItem("Tools", "QML/JS", "Run Checks")
# verify that error properly reported # verify that error properly reported
# internal check returns e.g.'Invalid property name "Color". (M16)' test.verify(checkSyntaxError(issuesView, ['Invalid property name "Color". (M16)'], True),
# but if project is CMake based the messages are generated by qmllint "Verifying if error is properly reported")
test.verify(checkSyntaxError(issuesView,
['Binding assigned to "Color", but no property "Color" exists in '
'the current element.'], False, True),
"Verifying if error or warning is properly reported")
# repair error - go to written line # repair error - go to written line
placeCursorToLine(editorArea, testingCodeLine) placeCursorToLine(editorArea, testingCodeLine)
for _ in range(14): for _ in range(14):