diff --git a/python/gui/auto_generated/qgsmessagelogviewer.sip.in b/python/gui/auto_generated/qgsmessagelogviewer.sip.in index 4eec2b549eb..efede8328bd 100644 --- a/python/gui/auto_generated/qgsmessagelogviewer.sip.in +++ b/python/gui/auto_generated/qgsmessagelogviewer.sip.in @@ -39,6 +39,8 @@ Logs a ``message`` to the viewer. virtual void reject(); + virtual bool eventFilter( QObject *obj, QEvent *ev ); + }; diff --git a/src/gui/qgsmessagelogviewer.cpp b/src/gui/qgsmessagelogviewer.cpp index 5c59913e246..c274e00bb62 100644 --- a/src/gui/qgsmessagelogviewer.cpp +++ b/src/gui/qgsmessagelogviewer.cpp @@ -30,6 +30,7 @@ #include #include #include +#include QgsMessageLogViewer::QgsMessageLogViewer( QWidget *parent, Qt::WindowFlags fl ) : QDialog( parent, fl ) @@ -70,6 +71,7 @@ void QgsMessageLogViewer::logMessage( const QString &message, const QString &tag { w = new QPlainTextEdit( this ); w->setReadOnly( true ); + w->viewport()->installEventFilter( this ); tabWidget->addTab( w, cleanedTag ); tabWidget->setCurrentIndex( tabWidget->count() - 1 ); } @@ -116,3 +118,43 @@ void QgsMessageLogViewer::closeTab( int index ) else tabWidget->removeTab( index ); } + +bool QgsMessageLogViewer::eventFilter( QObject *object, QEvent *event ) +{ + switch ( event->type() ) + { + case QEvent::MouseButtonPress: + { + if ( QPlainTextEdit *te = qobject_cast( object->parent() ) ) + { + QMouseEvent *me = static_cast< QMouseEvent *>( event ); + mClickedAnchor = ( me->button() & Qt::LeftButton ) ? te->anchorAt( me->pos() ) : + QString(); + if ( !mClickedAnchor.isEmpty() ) + return true; + } + break; + } + + case QEvent::MouseButtonRelease: + { + if ( QPlainTextEdit *te = qobject_cast( object->parent() ) ) + { + QMouseEvent *me = static_cast< QMouseEvent *>( event ); + QString clickedAnchor = ( me->button() & Qt::LeftButton ) ? te->anchorAt( me->pos() ) : + QString(); + if ( !clickedAnchor.isEmpty() && clickedAnchor == mClickedAnchor ) + { + QDesktopServices::openUrl( mClickedAnchor ); + return true; + } + } + break; + } + + default: + break; + } + + return QDialog::eventFilter( object, event ); +} diff --git a/src/gui/qgsmessagelogviewer.h b/src/gui/qgsmessagelogviewer.h index 0aca4daec3c..82b0eaeeca7 100644 --- a/src/gui/qgsmessagelogviewer.h +++ b/src/gui/qgsmessagelogviewer.h @@ -53,9 +53,14 @@ class GUI_EXPORT QgsMessageLogViewer: public QDialog, private Ui::QgsMessageLogV protected: void closeEvent( QCloseEvent *e ) override; void reject() override; + bool eventFilter( QObject *obj, QEvent *ev ) override; private slots: void closeTab( int index ); + + private: + + QString mClickedAnchor; }; #endif