Merge branch 'wxQt-memory-leaks' of https://github.com/catalinr/wxWidgets

Fix many memory leaks in wxQt port.

See https://github.com/wxWidgets/wxWidgets/pull/1243
This commit is contained in:
Vadim Zeitlin
2019-03-05 23:36:41 +01:00
13 changed files with 71 additions and 81 deletions

View File

@@ -211,19 +211,16 @@ void wxWindowQt::Init()
m_vertScrollBar = NULL;
m_qtPicture = NULL;
m_qtPainter = new QPainter();
m_qtPainter.reset(new QPainter());
m_mouseInside = false;
#if wxUSE_ACCEL
m_qtShortcutHandler = new wxQtShortcutHandler( this );
m_qtShortcutHandler.reset(new wxQtShortcutHandler(this));
m_processingShortcut = false;
m_qtShortcuts = NULL;
#endif
m_qtWindow = NULL;
m_qtContainer = NULL;
m_dropTarget = NULL;
}
wxWindowQt::wxWindowQt()
@@ -251,13 +248,6 @@ wxWindowQt::~wxWindowQt()
DestroyChildren(); // This also destroys scrollbars
delete m_qtPainter;
#if wxUSE_ACCEL
m_qtShortcutHandler->deleteLater();
delete m_qtShortcuts;
#endif
#if wxUSE_DRAG_AND_DROP
SetDropTarget(NULL);
#endif
@@ -266,23 +256,8 @@ wxWindowQt::~wxWindowQt()
if (m_qtWindow)
{
wxLogTrace(TRACE_QT_WINDOW, wxT("wxWindow::~wxWindow %s m_qtWindow=%p"), GetName(), m_qtWindow);
// Avoid sending further signals (i.e. if deleting the current page)
m_qtWindow->blockSignals(true);
// Reset the pointer to avoid handling pending event and signals
QtStoreWindowPointer( GetHandle(), NULL );
if ( m_horzScrollBar )
{
QtStoreWindowPointer( m_horzScrollBar, NULL );
m_horzScrollBar->deleteLater();
}
if ( m_vertScrollBar )
{
QtStoreWindowPointer( m_vertScrollBar, NULL );
m_vertScrollBar->deleteLater();
}
// Delete QWidget when control return to event loop (safer)
m_qtWindow->deleteLater();
m_qtWindow = NULL;
delete m_qtWindow;
}
else
{
@@ -622,6 +597,8 @@ QScrollBar *wxWindowQt::QtSetScrollBar( int orientation, QScrollBar *scrollBar )
void wxWindowQt::SetScrollbar( int orientation, int pos, int thumbvisible, int range, bool WXUNUSED(refresh) )
{
wxCHECK_RET(GetHandle(), "Window has not been created");
//If not exist, create the scrollbar
QScrollBar *scrollBar = QtGetScrollBar( orientation );
if ( scrollBar == NULL )
@@ -706,6 +683,7 @@ void wxWindowQt::SetDropTarget( wxDropTarget *dropTarget )
if ( m_dropTarget != NULL )
{
m_dropTarget->Disconnect();
delete m_dropTarget;
}
m_dropTarget = dropTarget;
@@ -1006,26 +984,25 @@ bool wxWindowQt::DoPopupMenu(wxMenu *menu, int x, int y)
#if wxUSE_ACCEL
void wxWindowQt::SetAcceleratorTable( const wxAcceleratorTable& accel )
{
wxCHECK_RET(GetHandle(), "Window has not been created");
wxWindowBase::SetAcceleratorTable( accel );
if ( m_qtShortcuts )
// Disable previously set accelerators
for ( wxVector<QShortcut*>::const_iterator it = m_qtShortcuts.begin();
it != m_qtShortcuts.end(); ++it )
{
// Disable previously set accelerators
while ( !m_qtShortcuts->isEmpty() )
delete m_qtShortcuts->takeFirst();
// Create new shortcuts (use GetHandle() so all events inside
// the window are handled, not only in the container subwindow)
delete m_qtShortcuts;
delete *it;
}
m_qtShortcuts = accel.ConvertShortcutTable( GetHandle() );
m_qtShortcuts = accel.ConvertShortcutTable(GetHandle());
// Connect shortcuts to window
Q_FOREACH( QShortcut *s, *m_qtShortcuts )
for ( wxVector<QShortcut*>::const_iterator it = m_qtShortcuts.begin();
it != m_qtShortcuts.end(); ++it )
{
QObject::connect( s, &QShortcut::activated, m_qtShortcutHandler, &wxQtShortcutHandler::activated );
QObject::connect( s, &QShortcut::activatedAmbiguously, m_qtShortcutHandler, &wxQtShortcutHandler::activated );
QObject::connect( *it, &QShortcut::activated, m_qtShortcutHandler.get(), &wxQtShortcutHandler::activated );
QObject::connect( *it, &QShortcut::activatedAmbiguously, m_qtShortcutHandler.get(), &wxQtShortcutHandler::activated );
}
}
#endif // wxUSE_ACCEL
@@ -1191,7 +1168,7 @@ bool wxWindowQt::QtHandlePaintEvent ( QWidget *handler, QPaintEvent *event )
else
{
// Data from wxClientDC, paint it
m_qtPicture->play( m_qtPainter );
m_qtPicture->play( m_qtPainter.get() );
// Reset picture
m_qtPicture->setData( NULL, 0 );
handled = true;
@@ -1574,5 +1551,5 @@ void wxWindowQt::QtSetPicture( QPicture* pict )
QPainter *wxWindowQt::QtGetPainter()
{
return m_qtPainter;
return m_qtPainter.get();
}