diff options
-rw-r--r-- | installerbuilder/libinstaller/component.cpp | 4 | ||||
-rw-r--r-- | installerbuilder/libinstaller/component_p.cpp | 16 | ||||
-rw-r--r-- | installerbuilder/libinstaller/component_p.h | 4 | ||||
-rw-r--r-- | installerbuilder/libinstaller/packagemanagergui.cpp | 19 |
4 files changed, 30 insertions, 13 deletions
diff --git a/installerbuilder/libinstaller/component.cpp b/installerbuilder/libinstaller/component.cpp index 70c9f0989..113e16623 100644 --- a/installerbuilder/libinstaller/component.cpp +++ b/installerbuilder/libinstaller/component.cpp @@ -512,11 +512,11 @@ QHash<QString, QPair<QString, QString> > Component::licenses() const } /*! - Returns the QWidget created for class \a name. + Returns the QWidget created for \a name or 0 if the widget already has been deleted or cannot be found. */ QWidget *Component::userInterface(const QString &name) const { - return d->m_userInterfaces.value(name); + return d->m_userInterfaces.value(name).data(); } /*! diff --git a/installerbuilder/libinstaller/component_p.cpp b/installerbuilder/libinstaller/component_p.cpp index fb63f6d6f..a6e34aa02 100644 --- a/installerbuilder/libinstaller/component_p.cpp +++ b/installerbuilder/libinstaller/component_p.cpp @@ -59,6 +59,22 @@ ComponentPrivate::ComponentPrivate(PackageManagerCore *core, Component *qq) { } +ComponentPrivate::~ComponentPrivate() +{ + // Before we can delete the added widgets, they need to be removed from the wizard first. + QMap<QString, QPointer<QWidget> >::const_iterator it; + foreach (const QString &widgetName, m_userInterfaces.keys()) { + m_core->removeWizardPage(q, widgetName); + m_core->removeWizardPageItem(q, widgetName); + } + + // Use QPointer here instead of raw pointers. This is a requirement that needs to be met cause possible + // Ui elements get added during component script run and might be destroyed by the package manager gui + // before the actual component gets destroyed. Avoids a possible delete call on a dangling pointer. + foreach (const QPointer<QWidget> widget, m_userInterfaces) + delete widget.data(); +} + void ComponentPrivate::init() { // register translation stuff diff --git a/installerbuilder/libinstaller/component_p.h b/installerbuilder/libinstaller/component_p.h index 119d9a5b0..c4c7cd76c 100644 --- a/installerbuilder/libinstaller/component_p.h +++ b/installerbuilder/libinstaller/component_p.h @@ -35,6 +35,7 @@ #include "qinstallerglobal.h" +#include <QtCore/QPointer> #include <QtCore/QStringList> #include <QtCore/QUrl> @@ -51,6 +52,7 @@ class ComponentPrivate public: explicit ComponentPrivate(PackageManagerCore *core, Component *qq); + ~ComponentPrivate(); void init(); void setProperty(QScriptValue &scriptValue, const QString &propertyName, int value); @@ -78,9 +80,9 @@ public: QList<Component*> m_allChildComponents; QList<Component*> m_virtualChildComponents; QStringList m_downloadableArchives; - QMap<QString, QWidget*> m_userInterfaces; QStringList m_stopProcessForUpdateRequests; QHash<QString, bool> m_unexistingScriptMethods; + QMap<QString, QPointer<QWidget> > m_userInterfaces; // < display name, < file name, file content > > QHash<QString, QPair<QString, QString> > m_licenses; diff --git a/installerbuilder/libinstaller/packagemanagergui.cpp b/installerbuilder/libinstaller/packagemanagergui.cpp index 0c079e709..f89ce9fa2 100644 --- a/installerbuilder/libinstaller/packagemanagergui.cpp +++ b/installerbuilder/libinstaller/packagemanagergui.cpp @@ -435,25 +435,24 @@ void PackageManagerGui::wizardPageInsertionRequested(QWidget *widget, // just in case it was already in there... wizardPageRemovalRequested(widget); - // now find a suitable ID lower than page - int p = static_cast<int>(page) - 1; - while (QWizard::page(p) != 0) - --p; + int pageId = static_cast<int>(page) - 1; + while (QWizard::page(pageId) != 0) + --pageId; + // add it - setPage(p, new DynamicInstallerPage(widget, m_core)); + setPage(pageId, new DynamicInstallerPage(widget, m_core)); } void PackageManagerGui::wizardPageRemovalRequested(QWidget *widget) { - const QList<int> pages = pageIds(); - for (QList<int>::const_iterator it = pages.begin(); it != pages.end(); ++it) { - QWizardPage *const p = page(*it); - DynamicInstallerPage *const dynamicPage = dynamic_cast<DynamicInstallerPage*>(p); + foreach (int pageId, pageIds()) { + DynamicInstallerPage *const dynamicPage = dynamic_cast<DynamicInstallerPage*>(page(pageId)); if (dynamicPage == 0) continue; if (dynamicPage->widget() != widget) continue; - removePage(*it); + removePage(pageId); + d->m_defaultPages.remove(pageId); } } |