Skip to content
Permalink
Browse files

Add a QgsFocusKeeper class to avoid crashes related to focus loss

Will be use to solve crash of #30210

Credits to @nyalldawson for pointing out the fix of #31905 as a
reference.
  • Loading branch information
rouault committed May 26, 2020
1 parent b09cdc4 commit f9bfbe713d1779d7f53db906e3b6a3b016996f32
Showing with 89 additions and 0 deletions.
  1. +1 −0 src/gui/CMakeLists.txt
  2. +40 −0 src/gui/qgsfocuskeeper.cpp
  3. +48 −0 src/gui/qgsfocuskeeper.h
@@ -416,6 +416,7 @@ SET(QGIS_GUI_SRCS
qgsfilterlineedit.cpp
qgsfindfilesbypatternwidget.cpp
qgsfloatingwidget.cpp
qgsfocuskeeper.cpp
qgsfocuswatcher.cpp
qgsfontbutton.cpp
qgsformannotation.cpp
@@ -0,0 +1,40 @@
/***************************************************************************
qgsfocuskeeper.cpp
-----------------
Date : May 2020
Copyright : (C) 2020 Even Rouault
Email : even dot rouault at spatialys dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsfocuskeeper.h"

#include <QApplication>
#include <QEvent>
#include <QWidget>

QgsFocusKeeper::QgsFocusKeeper(): mWidgetToKeepFocused( QApplication::focusWidget() )
{
mWidgetToKeepFocused->installEventFilter( this );
}

QgsFocusKeeper::~QgsFocusKeeper()
{
mWidgetToKeepFocused->removeEventFilter( this );
}

bool QgsFocusKeeper::eventFilter( QObject *obj, QEvent *event )
{
if ( obj == mWidgetToKeepFocused && event &&
( event->type() == QEvent::FocusOut || event->type() == QEvent::FocusAboutToChange ) )
{
return true;
}
return QObject::eventFilter( obj, event );
}
@@ -0,0 +1,48 @@
/***************************************************************************
qgsfocuskeeper.h
---------------
Date : May 2020
Copyright : (C) 2020 Even Rouault
Email : even dot rouault at spatialys dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSFOCUSKEEPER_H
#define QGSFOCUSKEEPER_H

#include "qgis_gui.h"

#define SIP_NO_FILE

#include <QObject>

class QWidget;

/**
* \ingroup gui
* \class QgsFocusKeeper
* Trick to keep a widget focused and avoid QT crashes
* \note not available in Python bindings
* \since QGIS 3.14
*/
class GUI_EXPORT QgsFocusKeeper : public QObject
{
Q_OBJECT

QWidget *mWidgetToKeepFocused = nullptr;

public:
QgsFocusKeeper();
~QgsFocusKeeper() override;

protected:
bool eventFilter( QObject *obj, QEvent *event ) override;
};

#endif // QGSFOCUSKEEPER_H

0 comments on commit f9bfbe7

Please sign in to comment.
You can’t perform that action at this time.