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:
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user