From fed16263023da6b453bb9119f3e44fa9100d5d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9nard?= Date: Wed, 7 Jan 2009 19:25:32 +0000 Subject: [PATCH] Fix the crash in Konsole with Qt 4.5. The problem is that ViewContainer is a QObject and is not aware that one of its QWidget member can die because the ViewContainer is not part of the "GUI" hierarchy. So when you delete the main window it will first delete all QWidgets and then all QObjects, so in our case all GUI objects and then ViewContainer. But since ViewContainer react to destroyed signal of some GUI object and use it that explain the crash. Having QPointer is the easy to way to be aware if one of the member die because the GUI has been deleted. BUG:170052 BUG:179845 svn path=/trunk/KDE/kdebase/apps/konsole/; revision=907272 --- src/ViewContainer.cpp | 14 ++++++++++++-- src/ViewContainer.h | 6 +++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/ViewContainer.cpp b/src/ViewContainer.cpp index bd1088deb..ef81d1716 100644 --- a/src/ViewContainer.cpp +++ b/src/ViewContainer.cpp @@ -487,9 +487,13 @@ TabbedViewContainer::TabbedViewContainer(NavigationPosition position , QObject* _containerWidget->setLayout(_layout); } void TabbedViewContainer::setNewViewMenu(QMenu* menu) -{ _newTabButton->setDelayedMenu(menu); } +{ + _newTabButton->setDelayedMenu(menu); +} ViewContainer::Features TabbedViewContainer::supportedFeatures() const -{ return QuickNewView|QuickCloseView; } +{ + return QuickNewView|QuickCloseView; +} void TabbedViewContainer::setFeatures(Features features) { ViewContainer::setFeatures(features); @@ -695,6 +699,8 @@ void TabbedViewContainer::addViewWidget( QWidget* view , int index) } void TabbedViewContainer::removeViewWidget( QWidget* view ) { + if (!_stackWidget) + return; const int index = _stackWidget->indexOf(view); Q_ASSERT( index != -1 ); @@ -802,6 +808,8 @@ void StackedViewContainer::addViewWidget( QWidget* view , int ) } void StackedViewContainer::removeViewWidget( QWidget* view ) { + if (!_stackWidget) + return; const int index = _stackWidget->indexOf(view); Q_ASSERT( index != -1); @@ -897,6 +905,8 @@ void ListViewContainer::addViewWidget( QWidget* view , int ) void ListViewContainer::removeViewWidget( QWidget* view ) { + if (!_stackWidget) + return; int index = _stackWidget->indexOf(view); _stackWidget->removeWidget(view); delete _listWidget->takeItem( index ); diff --git a/src/ViewContainer.h b/src/ViewContainer.h index 28d0d0076..0b4e4082b 100644 --- a/src/ViewContainer.h +++ b/src/ViewContainer.h @@ -449,7 +449,7 @@ private: void setTabActivity(int index,bool activity); ViewContainerTabBar* _tabBar; - QStackedWidget* _stackWidget; + QPointer _stackWidget; QPointer _containerWidget; QSpacerItem* _tabBarSpacer; TabbedViewContainerLayout* _layout; @@ -477,7 +477,7 @@ protected: private: QPointer _containerWidget; - QStackedWidget* _stackWidget; + QPointer _stackWidget; }; /** @@ -508,7 +508,7 @@ private slots: private: QBrush randomItemBackground(int randomIndex); - QStackedWidget* _stackWidget; + QPointer _stackWidget; QSplitter* _splitter; QListWidget* _listWidget; };