From 4ee0523b5129c6fa278bbede44f641316e456d0b Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Fri, 19 Jan 2018 16:15:20 +0100 Subject: [PATCH] logic: fixed some memory leaks in gui code --- src/lib_gui/qt/element/QtScreenSearchBox.cpp | 5 +++-- src/lib_gui/qt/element/QtScreenSearchBox.h | 2 +- src/lib_gui/qt/element/QtStatusBar.cpp | 14 +++++--------- src/lib_gui/qt/element/QtStatusBar.h | 6 ++++-- src/lib_gui/qt/element/QtTable.cpp | 8 +++++++- src/lib_gui/qt/view/QtErrorView.cpp | 10 +++++++++- src/lib_gui/qt/window/QtStartScreen.cpp | 20 ++++++++++---------- src/lib_gui/qt/window/QtStartScreen.h | 8 ++++---- 8 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/lib_gui/qt/element/QtScreenSearchBox.cpp b/src/lib_gui/qt/element/QtScreenSearchBox.cpp index a04178f1..b40b26c4 100644 --- a/src/lib_gui/qt/element/QtScreenSearchBox.cpp +++ b/src/lib_gui/qt/element/QtScreenSearchBox.cpp @@ -12,7 +12,8 @@ #include "utility/ResourcePaths.h" -QtFocusInFilter::QtFocusInFilter() +QtFocusInFilter::QtFocusInFilter(QObject* parent) + : QObject(parent) { } @@ -57,7 +58,7 @@ QtScreenSearchBox::QtScreenSearchBox(ControllerProxy* co connect(m_searchBox, &QLineEdit::textChanged, this, &QtScreenSearchBox::searchQueryChanged); connect(m_searchBox, &QLineEdit::returnPressed, this, &QtScreenSearchBox::returnPressed); - QtFocusInFilter* filter = new QtFocusInFilter(); + QtFocusInFilter* filter = new QtFocusInFilter(m_searchBox); m_searchBox->installEventFilter(filter); connect(filter, &QtFocusInFilter::focusIn, this, &QtScreenSearchBox::findMatches); } diff --git a/src/lib_gui/qt/element/QtScreenSearchBox.h b/src/lib_gui/qt/element/QtScreenSearchBox.h index 2636d5b4..bf6a88b8 100644 --- a/src/lib_gui/qt/element/QtScreenSearchBox.h +++ b/src/lib_gui/qt/element/QtScreenSearchBox.h @@ -19,7 +19,7 @@ class QtFocusInFilter Q_OBJECT public: - QtFocusInFilter(); + QtFocusInFilter(QObject* parent = Q_NULLPTR); signals: void focusIn(); diff --git a/src/lib_gui/qt/element/QtStatusBar.cpp b/src/lib_gui/qt/element/QtStatusBar.cpp index 2b8968d3..71b31e67 100644 --- a/src/lib_gui/qt/element/QtStatusBar.cpp +++ b/src/lib_gui/qt/element/QtStatusBar.cpp @@ -13,15 +13,15 @@ QtStatusBar::QtStatusBar() { addWidget(new QWidget()); // add some space - QMovie* movie = new QMovie((ResourcePaths::getGuiPath().str() + "statusbar_view/loader.gif").c_str()); + m_movie = std::make_shared((ResourcePaths::getGuiPath().str() + "statusbar_view/loader.gif").c_str()); // if movie doesn't loop forever, force it to. - if (movie->loopCount() != -1) + if (m_movie->loopCount() != -1) { - connect(movie, &QMovie::finished, movie, &QMovie::start); + connect(m_movie.get(), &QMovie::finished, m_movie.get(), &QMovie::start); } - movie->start(); + m_movie->start(); - m_loader.setMovie(movie); + m_loader.setMovie(m_movie.get()); m_loader.hide(); addWidget(&m_loader); @@ -49,10 +49,6 @@ QtStatusBar::QtStatusBar() connect(&m_errorButton, &QPushButton::clicked, this, &QtStatusBar::showErrors); } -QtStatusBar::~QtStatusBar() -{ -} - void QtStatusBar::setText(const std::string& text, bool isError, bool showLoader) { if (isError) diff --git a/src/lib_gui/qt/element/QtStatusBar.h b/src/lib_gui/qt/element/QtStatusBar.h index 94e428f6..2dd04058 100644 --- a/src/lib_gui/qt/element/QtStatusBar.h +++ b/src/lib_gui/qt/element/QtStatusBar.h @@ -1,6 +1,7 @@ #ifndef QT_STATUS_BAR_H #define QT_STATUS_BAR_H +#include #include #include @@ -15,8 +16,7 @@ class QtStatusBar Q_OBJECT public: - QtStatusBar(void); - virtual ~QtStatusBar(void); + QtStatusBar(); void setText(const std::string& text, bool isError, bool showLoader); void setErrorCount(ErrorCountInfo errorCount); @@ -31,6 +31,8 @@ private slots: void showErrors(); private: + std::shared_ptr m_movie; + std::string m_textString; QPushButton m_text; diff --git a/src/lib_gui/qt/element/QtTable.cpp b/src/lib_gui/qt/element/QtTable.cpp index 13bc653b..0a4e06ce 100644 --- a/src/lib_gui/qt/element/QtTable.cpp +++ b/src/lib_gui/qt/element/QtTable.cpp @@ -13,9 +13,15 @@ class SelectableCellDelegate : public QStyledItemDelegate { +public: + SelectableCellDelegate(QObject* parent = Q_NULLPTR); QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; +SelectableCellDelegate::SelectableCellDelegate(QObject* parent) + : QStyledItemDelegate(parent) +{ +} QWidget* SelectableCellDelegate::createEditor( QWidget* parent, @@ -39,7 +45,7 @@ QtTable::QtTable(QWidget* parent) setShowGrid(false); setMouseTracking(true); - this->setItemDelegate(new SelectableCellDelegate()); + this->setItemDelegate(new SelectableCellDelegate(this)); verticalHeader()->sectionResizeMode(QHeaderView::Fixed); verticalHeader()->setDefaultAlignment(Qt::AlignRight); diff --git a/src/lib_gui/qt/view/QtErrorView.cpp b/src/lib_gui/qt/view/QtErrorView.cpp index 19e597e8..8299d987 100644 --- a/src/lib_gui/qt/view/QtErrorView.cpp +++ b/src/lib_gui/qt/view/QtErrorView.cpp @@ -28,9 +28,17 @@ QIcon QtErrorView::s_errorIcon; class SelectableDelegate : public QStyledItemDelegate { +public: + SelectableDelegate(QObject* parent = Q_NULLPTR); QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; +SelectableDelegate::SelectableDelegate(QObject* parent) + : QStyledItemDelegate(parent) +{ +} + + QWidget* SelectableDelegate::createEditor( QWidget* parent, const QStyleOptionViewItem &option, @@ -73,7 +81,7 @@ void QtErrorView::initView() m_table = new QtTable(this); m_model = new QStandardItemModel(this); m_table->setModel(m_model); - m_table->setItemDelegate(new SelectableDelegate()); + m_table->setItemDelegate(new SelectableDelegate(m_table)); // Setup Table Headers m_model->setColumnCount(COLUMN_MAX + 1); diff --git a/src/lib_gui/qt/window/QtStartScreen.cpp b/src/lib_gui/qt/window/QtStartScreen.cpp index 9b56f873..acb92124 100644 --- a/src/lib_gui/qt/window/QtStartScreen.cpp +++ b/src/lib_gui/qt/window/QtStartScreen.cpp @@ -85,6 +85,10 @@ void QtRecentProjectButton::handleButtonClick() QtStartScreen::QtStartScreen(QWidget *parent) : QtWindow(true, parent) + , m_cppIcon((ResourcePaths::getGuiPath().str() + "icon/cpp_icon.png").c_str()) + , m_cIcon((ResourcePaths::getGuiPath().str() + "icon/c_icon.png").c_str()) + , m_javaIcon((ResourcePaths::getGuiPath().str() + "icon/java_icon.png").c_str()) + , m_projectIcon((ResourcePaths::getGuiPath().str() + "icon/empty_icon.png").c_str()) { } @@ -96,7 +100,7 @@ QSize QtStartScreen::sizeHint() const void QtStartScreen::updateButtons() { std::vector recentProjects = ApplicationSettings::getInstance()->getRecentProjects(); -size_t i = 0; + size_t i = 0; for (QtRecentProjectButton* button : m_recentProjectsButtons) { button->disconnect(); @@ -107,16 +111,16 @@ size_t i = 0; switch (lang) { case LanguageType::LANGUAGE_C: - button->setIcon(*m_cIcon); + button->setIcon(m_cIcon); break; case LANGUAGE_CPP: - button->setIcon(*m_cppIcon); + button->setIcon(m_cppIcon); break; case LANGUAGE_JAVA: - button->setIcon(*m_javaIcon); + button->setIcon(m_javaIcon); break; default: - button->setIcon(*m_projectIcon); + button->setIcon(m_projectIcon); break; } button->setFixedWidth(button->fontMetrics().width(button->text()) + 45); @@ -223,17 +227,13 @@ void QtStartScreen::setupStartScreen() col->addSpacing(20); - m_cppIcon = new QIcon((ResourcePaths::getGuiPath().str() + "icon/cpp_icon.png").c_str()); - m_cIcon = new QIcon((ResourcePaths::getGuiPath().str() + "icon/c_icon.png").c_str()); - m_javaIcon = new QIcon((ResourcePaths::getGuiPath().str() + "icon/java_icon.png").c_str()); - m_projectIcon = new QIcon((ResourcePaths::getGuiPath().str() + "icon/empty_icon.png").c_str()); for (int i = 0 ; i < ApplicationSettings::getInstance()->getMaxRecentProjectsCount() ; i++) { QtRecentProjectButton* button = new QtRecentProjectButton(this); button->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac - button->setIcon(*m_projectIcon); + button->setIcon(m_projectIcon); button->setIconSize(QSize(30, 30)); button->setMinimumSize(button->fontMetrics().width(button->text()) + 45, 40); button->setObjectName("recentButtonMissing"); diff --git a/src/lib_gui/qt/window/QtStartScreen.h b/src/lib_gui/qt/window/QtStartScreen.h index 642807eb..ebf1b81e 100644 --- a/src/lib_gui/qt/window/QtStartScreen.h +++ b/src/lib_gui/qt/window/QtStartScreen.h @@ -50,10 +50,10 @@ private slots: private: std::vector m_recentProjectsButtons; - QIcon* m_cppIcon; - QIcon* m_cIcon; - QIcon* m_javaIcon; - QIcon* m_projectIcon; + QIcon m_cppIcon; + QIcon m_cIcon; + QIcon m_javaIcon; + QIcon m_projectIcon; }; #endif // QT_START_SCREEN_H