diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-06-23 15:19:00 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-06-23 14:22:08 +0000 |
commit | 29cf39bfd6424364eeefd07e65cc0c613848ced2 (patch) | |
tree | 957ea0d76af393aefeb4784859f5089213d6835c | |
parent | 64c5f960e82f6efb947907041ab6e40860ea4652 (diff) | |
download | qt-creator-29cf39bfd6424364eeefd07e65cc0c613848ced2.tar.gz |
ProjectExplorer: Fix crash in AppOutputPane
The RunControl owns the Formatter set on the OutputWindow. Make
sure the OutputWindow is deleted before the RunControl and avoid
some useless setting of the Formatter.
Task-number: QTCREATORBUG-18428
Change-Id: I40c8f032bb04c484957a35a6bbc0fda7b6491c51
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r-- | src/plugins/projectexplorer/appoutputpane.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index b7189bbb1c..a9a46974bb 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -149,7 +149,10 @@ void TabWidget::slotContextMenuRequested(const QPoint &pos) AppOutputPane::RunControlTab::RunControlTab(RunControl *rc, Core::OutputWindow *w) : runControl(rc), window(w) -{ } +{ + if (rc && w) + w->setFormatter(rc->outputFormatter()); +} AppOutputPane::AppOutputPane() : m_mainWidget(new QWidget), @@ -262,7 +265,7 @@ AppOutputPane::~AppOutputPane() qDebug() << "OutputPane::~OutputPane: Entries left" << m_runControlTabs.size(); foreach (const RunControlTab &rt, m_runControlTabs) { - rt.window->setFormatter(nullptr); + delete rt.window; delete rt.runControl; } delete m_mainWidget; @@ -416,13 +419,14 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) RunControlTab &tab = m_runControlTabs[tabIndex]; // Reuse this tab delete tab.runControl; - handleOldOutput(tab.window); tab.runControl = rc; + tab.window->setFormatter(rc ? rc->outputFormatter() : nullptr); + + handleOldOutput(tab.window); // Update the title. m_tabWidget->setTabText(tabIndex, rc->displayName()); - tab.window->setFormatter(nullptr); tab.window->scrollToBottom(); if (debug) qDebug() << "OutputPane::createNewOutputWindow: Reusing tab" << tabIndex << " for " << rc; @@ -435,7 +439,6 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) Core::OutputWindow *ow = new Core::OutputWindow(context, m_tabWidget); ow->setWindowTitle(tr("Application Output Window")); ow->setWindowIcon(Icons::WINDOW.icon()); - ow->setFormatter(nullptr); ow->setWordWrapEnabled(ProjectExplorerPlugin::projectExplorerSettings().wrapAppOutput); ow->setMaxLineCount(ProjectExplorerPlugin::projectExplorerSettings().maxAppOutputLines); ow->setWheelZoomEnabled(TextEditor::TextEditorSettings::behaviorSettings().m_scrollWheelZooming); @@ -592,9 +595,8 @@ bool AppOutputPane::closeTab(int tabIndex, CloseTabMode closeTabMode) } m_tabWidget->removeTab(tabIndex); - m_runControlTabs[index].window->setFormatter(nullptr); - delete m_runControlTabs[index].runControl; delete m_runControlTabs[index].window; + delete m_runControlTabs[index].runControl; m_runControlTabs.removeAt(index); updateCloseActions(); @@ -708,10 +710,6 @@ void AppOutputPane::contextMenuRequested(const QPoint &pos, int index) void AppOutputPane::slotRunControlStarted() { RunControl *current = currentRunControl(); - const int rcIndex = indexOf(current); - if (rcIndex >= 0 && m_runControlTabs.at(rcIndex).window) - m_runControlTabs.at(rcIndex).window->setFormatter(current->outputFormatter()); - if (current && current == sender()) enableButtons(current, true); // RunControl::isRunning() cannot be trusted in signal handler. emit runControlStarted(current); |