Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.

(cherry picked from commit f9bfbe7)
  • Loading branch information
rouault authored and nyalldawson committed Jun 19, 2020
1 parent 1e62347 commit af28b42
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/gui/CMakeLists.txt
Expand Up @@ -300,6 +300,7 @@ SET(QGIS_GUI_SRCS
qgsfilterlineedit.cpp
qgsfindfilesbypatternwidget.cpp
qgsfloatingwidget.cpp
qgsfocuskeeper.cpp
qgsfocuswatcher.cpp
qgsfontbutton.cpp
qgsformannotation.cpp
Expand Down
40 changes: 40 additions & 0 deletions src/gui/qgsfocuskeeper.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 );
}
48 changes: 48 additions & 0 deletions src/gui/qgsfocuskeeper.h
@@ -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 af28b42

Please sign in to comment.