Skip to content

Commit

Permalink
bypass the problematic QTextEdit toHtml function
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastian committed Jun 2, 2024
1 parent 63e63d4 commit 9874efa
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 155 deletions.
310 changes: 157 additions & 153 deletions src/app/qgisapp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5508,200 +5508,204 @@ void QgisApp::about()
if ( !sAbt )
{
sAbt = new QgsAbout( this );
QString versionString = QStringLiteral( "<div align='center'><table width='100%'>" );
sAbt->setVersion( QgisApp::getVersionString() );
}
sAbt->show();
sAbt->raise();
sAbt->activateWindow();
}

versionString += QStringLiteral( "<tr><td colspan=\"2\"><b>%1</b></td>" ).arg( tr( "Libraries" ) );
versionString += QStringLiteral( "<tr><td>%1</td><td>%2</td>" ).arg( tr( "QGIS version" ), Qgis::version() );
QString QgisApp::getVersionString()
{
QString versionString = QStringLiteral( "<table width='100%' align='center'>" );

if ( QString( Qgis::devVersion() ) == QLatin1String( "exported" ) )
{
versionString += tr( "QGIS code branch" );
if ( Qgis::version().endsWith( QLatin1String( "Master" ) ) )
{
versionString += QLatin1String( "<td><a href=\"https://github.com/qgis/QGIS/tree/master\">master</a></td>" );
}
else
{
versionString += QStringLiteral( "<td><a href=\"https://github.com/qgis/QGIS/tree/release-%1_%2\">Release %1.%2</a></td>" )
.arg( Qgis::versionInt() / 10000 ).arg( Qgis::versionInt() / 100 % 100 );
}
}
else
{
versionString += QLatin1String( "</tr><tr>" );
versionString += QStringLiteral( "<td>%1</td><td><a href=\"https://github.com/qgis/QGIS/commit/%2\">%2</a></td>" ).arg( tr( "QGIS code revision" ), Qgis::devVersion() );
}
versionString += QLatin1String( "</tr><tr>" );
versionString += QStringLiteral( "<tr><td colspan=\"2\"><b>%1</b></td>" ).arg( tr( "Libraries" ) );
versionString += QStringLiteral( "<tr><td>%1</td><td>%2</td>" ).arg( tr( "QGIS version" ), Qgis::version() );

// Qt version
const QString qtVersionCompiled{ QT_VERSION_STR };
const QString qtVersionRunning{ qVersion() };
if ( qtVersionCompiled != qtVersionRunning )
if ( QString( Qgis::devVersion() ) == QLatin1String( "exported" ) )
{
versionString += tr( "QGIS code branch" );
if ( Qgis::version().endsWith( QLatin1String( "Master" ) ) )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against Qt" ), qtVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against Qt" ), qtVersionRunning );
versionString += QLatin1String( "<td><a href=\"https://github.com/qgis/QGIS/tree/master\">master</a></td>" );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Qt version" ), qtVersionCompiled );
versionString += QStringLiteral( "<td><a href=\"https://github.com/qgis/QGIS/tree/release-%1_%2\">Release %1.%2</a></td>" )
.arg( Qgis::versionInt() / 10000 ).arg( Qgis::versionInt() / 100 % 100 );
}
}
else
{
versionString += QLatin1String( "</tr><tr>" );
versionString += QStringLiteral( "<td>%1</td><td><a href=\"https://github.com/qgis/QGIS/commit/%2\">%2</a></td>" ).arg( tr( "QGIS code revision" ), Qgis::devVersion() );
}
versionString += QLatin1String( "</tr><tr>" );

// Python version
QString pythonVersion;
QgsPythonRunner::run( QStringLiteral( "import platform" ) );
QgsPythonRunner::eval( QStringLiteral( "platform.python_version()" ), pythonVersion );
if ( pythonVersion != PYTHON_VERSION )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against Python" ), PYTHON_VERSION );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against Python" ), pythonVersion );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Python version" ), PYTHON_VERSION );
}
versionString += QLatin1String( "</tr><tr>" );
// Qt version
const QString qtVersionCompiled{ QT_VERSION_STR };
const QString qtVersionRunning{ qVersion() };
if ( qtVersionCompiled != qtVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against Qt" ), qtVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against Qt" ), qtVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Qt version" ), qtVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );

// GDAL version
const QString gdalVersionCompiled { GDAL_RELEASE_NAME };
const QString gdalVersionRunning { GDALVersionInfo( "RELEASE_NAME" ) };
if ( gdalVersionCompiled != gdalVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against GDAL/OGR" ), gdalVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against GDAL/OGR" ), gdalVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "GDAL/OGR version" ), gdalVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
// Python version
QString pythonVersion;
QgsPythonRunner::run( QStringLiteral( "import platform" ) );
QgsPythonRunner::eval( QStringLiteral( "platform.python_version()" ), pythonVersion );
if ( pythonVersion != PYTHON_VERSION )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against Python" ), PYTHON_VERSION );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against Python" ), pythonVersion );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Python version" ), PYTHON_VERSION );
}
versionString += QLatin1String( "</tr><tr>" );

// proj
PJ_INFO info = proj_info();
const QString projVersionCompiled { QStringLiteral( "%1.%2.%3" ).arg( PROJ_VERSION_MAJOR ).arg( PROJ_VERSION_MINOR ).arg( PROJ_VERSION_PATCH ) };
const QString projVersionRunning { info.version };
if ( projVersionCompiled != projVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against PROJ" ), projVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against PROJ" ), projVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "PROJ version" ), projVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
// GDAL version
const QString gdalVersionCompiled { GDAL_RELEASE_NAME };
const QString gdalVersionRunning { GDALVersionInfo( "RELEASE_NAME" ) };
if ( gdalVersionCompiled != gdalVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against GDAL/OGR" ), gdalVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against GDAL/OGR" ), gdalVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "GDAL/OGR version" ), gdalVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );

// CRS database versions
versionString += QStringLiteral( "<td>%1</td><td>%2 (%3)</td>" ).arg( tr( "EPSG Registry database version" ), QgsProjUtils::epsgRegistryVersion(), QgsProjUtils::epsgRegistryDate().toString( Qt::ISODate ) );
versionString += QLatin1String( "</tr><tr>" );
// proj
PJ_INFO info = proj_info();
const QString projVersionCompiled { QStringLiteral( "%1.%2.%3" ).arg( PROJ_VERSION_MAJOR ).arg( PROJ_VERSION_MINOR ).arg( PROJ_VERSION_PATCH ) };
const QString projVersionRunning { info.version };
if ( projVersionCompiled != projVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against PROJ" ), projVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against PROJ" ), projVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "PROJ version" ), projVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );

// GEOS version
const QString geosVersionCompiled { GEOS_CAPI_VERSION };
const QString geosVersionRunning { GEOSversion() };
if ( geosVersionCompiled != geosVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against GEOS" ), geosVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against GEOS" ), geosVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "GEOS version" ), geosVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
// CRS database versions
versionString += QStringLiteral( "<td>%1</td><td>%2 (%3)</td>" ).arg( tr( "EPSG Registry database version" ), QgsProjUtils::epsgRegistryVersion(), QgsProjUtils::epsgRegistryDate().toString( Qt::ISODate ) );
versionString += QLatin1String( "</tr><tr>" );

// SQLite version
const QString sqliteVersionCompiled { SQLITE_VERSION };
const QString sqliteVersionRunning { sqlite3_libversion() };
if ( sqliteVersionCompiled != sqliteVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against SQLite" ), sqliteVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against SQLite" ), sqliteVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "SQLite version" ), sqliteVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
// GEOS version
const QString geosVersionCompiled { GEOS_CAPI_VERSION };
const QString geosVersionRunning { GEOSversion() };
if ( geosVersionCompiled != geosVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against GEOS" ), geosVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against GEOS" ), geosVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "GEOS version" ), geosVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );

// SQLite version
const QString sqliteVersionCompiled { SQLITE_VERSION };
const QString sqliteVersionRunning { sqlite3_libversion() };
if ( sqliteVersionCompiled != sqliteVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against SQLite" ), sqliteVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against SQLite" ), sqliteVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "SQLite version" ), sqliteVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );

// PDAL
// PDAL
#ifdef HAVE_PDAL_QGIS
const QString pdalVersionCompiled { PDAL_VERSION };
const QString pdalVersionCompiled { PDAL_VERSION };
#if PDAL_VERSION_MAJOR_INT > 1 || (PDAL_VERSION_MAJOR_INT == 1 && PDAL_VERSION_MINOR_INT >= 7)
const QString pdalVersionRunningRaw { QString::fromStdString( pdal::Config::fullVersionString() ) };
const QString pdalVersionRunningRaw { QString::fromStdString( pdal::Config::fullVersionString() ) };
#else
const QString pdalVersionRunningRaw { QString::fromStdString( pdal::GetFullVersionString() ) };
const QString pdalVersionRunningRaw { QString::fromStdString( pdal::GetFullVersionString() ) };
#endif
const thread_local QRegularExpression pdalVersionRx { QStringLiteral( "(\\d+\\.\\d+\\.\\d+)" )};
const QRegularExpressionMatch pdalVersionMatch{ pdalVersionRx.match( pdalVersionRunningRaw ) };
const QString pdalVersionRunning{ pdalVersionMatch.hasMatch() ? pdalVersionMatch.captured( 1 ) : pdalVersionRunningRaw };
if ( pdalVersionCompiled != pdalVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against PDAL" ), pdalVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against PDAL" ), pdalVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "PDAL version" ), pdalVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
const thread_local QRegularExpression pdalVersionRx { QStringLiteral( "(\\d+\\.\\d+\\.\\d+)" )};
const QRegularExpressionMatch pdalVersionMatch{ pdalVersionRx.match( pdalVersionRunningRaw ) };
const QString pdalVersionRunning{ pdalVersionMatch.hasMatch() ? pdalVersionMatch.captured( 1 ) : pdalVersionRunningRaw };
if ( pdalVersionCompiled != pdalVersionRunning )
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Compiled against PDAL" ), pdalVersionCompiled );
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "Running against PDAL" ), pdalVersionRunning );
}
else
{
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "PDAL version" ), pdalVersionCompiled );
}
versionString += QLatin1String( "</tr><tr>" );
#endif

// postgres
versionString += QStringLiteral( "<td>%1</td><td>" ).arg( tr( "PostgreSQL client version" ) );
// postgres
versionString += QStringLiteral( "<td>%1</td><td>" ).arg( tr( "PostgreSQL client version" ) );
#ifdef HAVE_POSTGRESQL
versionString += QStringLiteral( PG_VERSION );
versionString += QStringLiteral( PG_VERSION );
#else
versionString += tr( "No support" );
versionString += tr( "No support" );
#endif
versionString += QLatin1String( "</td></tr><tr>" );
versionString += QLatin1String( "</td></tr><tr>" );

// spatialite
versionString += QStringLiteral( "<td>%1</td><td>" ).arg( tr( "SpatiaLite version" ) );
// spatialite
versionString += QStringLiteral( "<td>%1</td><td>" ).arg( tr( "SpatiaLite version" ) );
#ifdef HAVE_SPATIALITE
versionString += QStringLiteral( "%1</td>" ).arg( spatialite_version() );
versionString += QStringLiteral( "%1</td>" ).arg( spatialite_version() );
#else
versionString += tr( "No support" );
versionString += tr( "No support" );
#endif
versionString += QLatin1String( "</td></tr><tr>" );
versionString += QLatin1String( "</td></tr><tr>" );

// QWT
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "QWT version" ), QWT_VERSION_STR );
versionString += QLatin1String( "</tr><tr>" );
// QWT
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "QWT version" ), QWT_VERSION_STR );
versionString += QLatin1String( "</tr><tr>" );

// QScintilla
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "QScintilla2 version" ), QSCINTILLA_VERSION_STR );
versionString += QLatin1String( "</tr><tr>" );
// QScintilla
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "QScintilla2 version" ), QSCINTILLA_VERSION_STR );
versionString += QLatin1String( "</tr><tr>" );

// Operating system
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "OS version" ), QSysInfo::prettyProductName() );
versionString += QLatin1String( "</tr><tr>" );
// Operating system
versionString += QStringLiteral( "<td>%1</td><td>%2</td>" ).arg( tr( "OS version" ), QSysInfo::prettyProductName() );
versionString += QLatin1String( "</tr><tr>" );

#ifdef QGISDEBUG
versionString += QLatin1String( "</tr><tr>" );
versionString += QStringLiteral( "<td colspan=\"2\"><i>%1</i></td>" ).arg( tr( "This copy of QGIS writes debugging output." ) );
versionString += QLatin1String( "</tr><tr>" );
versionString += QLatin1String( "</tr><tr>" );
versionString += QStringLiteral( "<td colspan=\"2\"><i>%1</i></td>" ).arg( tr( "This copy of QGIS writes debugging output." ) );
versionString += QLatin1String( "</tr><tr>" );
#endif

#ifdef WITH_BINDINGS
if ( mPythonUtils && mPythonUtils->isEnabled() )
if ( mPythonUtils && mPythonUtils->isEnabled() )
{
versionString += QStringLiteral( "<td colspan=\"2\">&nbsp;</td></tr><tr><td colspan=\"2\"><b>%1</b></td>" ).arg( tr( "Active Python plugins" ) );
const QStringList activePlugins = mPythonUtils->listActivePlugins();
for ( const QString &plugin : activePlugins )
{
versionString += QStringLiteral( "</tr><tr><td colspan=\"2\"><b>%1</b></td>" ).arg( tr( "Active Python plugins" ) );
const QStringList activePlugins = mPythonUtils->listActivePlugins();
for ( const QString &plugin : activePlugins )
{
const QString version = mPythonUtils->getPluginMetadata( plugin, QStringLiteral( "version" ) );
versionString += QStringLiteral( "</tr><tr><td>%1</td><td>%2</td>" ).arg( plugin, version );
}
const QString version = mPythonUtils->getPluginMetadata( plugin, QStringLiteral( "version" ) );
versionString += QStringLiteral( "</tr><tr><td>%1</td><td>%2</td>" ).arg( plugin, version );
}
}
#endif

versionString += QLatin1String( "</tr></table></div>" );

sAbt->setVersion( versionString );
}
sAbt->show();
sAbt->raise();
sAbt->activateWindow();
versionString += QLatin1String( "</tr></table>" );
return versionString;
}

QString QgisApp::crsAndFormatAdjustedLayerUri( const QString &uri, const QStringList &supportedCrs, const QStringList &supportedFormats ) const
Expand Down
5 changes: 5 additions & 0 deletions src/app/qgisapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,11 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
const QString &baseName,
const QString &provider );

/**
* Returns the html formated string with current versions of the libraries and the active plugins
*/
QString getVersionString();

public slots:
//! save current vector layer
QString saveAsFile( QgsMapLayer *layer = nullptr, bool onlySelected = false, bool defaultToAddToMap = true );
Expand Down
5 changes: 3 additions & 2 deletions src/app/qgsabout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
* *
***************************************************************************/

#include "qgisapp.h"
#include "qgsabout.h"
#include "qgsapplication.h"
#include "qgsauthmethodregistry.h"
Expand Down Expand Up @@ -275,8 +276,8 @@ void QgsAbout::setPluginInfo()

void QgsAbout::btnCopyToClipboard_clicked()
{
QString markdown = txtVersion->toHtml();
QGuiApplication::clipboard()->setText( markdown );
const QString versionString = QgisApp::instance()->getVersionString();
QGuiApplication::clipboard()->setText( versionString );
}

void QgsAbout::btnQgisUser_clicked()
Expand Down

0 comments on commit 9874efa

Please sign in to comment.