diff options
Diffstat (limited to 'src/libs/installer/aspectratiolabel.cpp')
-rw-r--r-- | src/libs/installer/aspectratiolabel.cpp | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/libs/installer/aspectratiolabel.cpp b/src/libs/installer/aspectratiolabel.cpp index c8c3c1693..b5a21424d 100644 --- a/src/libs/installer/aspectratiolabel.cpp +++ b/src/libs/installer/aspectratiolabel.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -28,6 +28,9 @@ #include "aspectratiolabel.h" +#include <QDesktopServices> +#include <QTimer> + using namespace QInstaller; /*! @@ -42,16 +45,35 @@ using namespace QInstaller; */ AspectRatioLabel::AspectRatioLabel(QWidget *parent) : QLabel(parent) + , m_discardMousePress(false) { setMinimumSize(1, 1); setScaledContents(false); + setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); } /*! - Sets the \a pixmap shown on the label. Setting a new pixmap clears the previous content. + Sets the \a pixmap shown on the label. Setting a new pixmap clears + the previous content. + + \note This redefines the non-virtual slot of the same signature from the + QLabel base class, which results in non polymorphic behavior when + called via a base class pointer. */ void AspectRatioLabel::setPixmap(const QPixmap &pixmap) { + setPixmapAndUrl(pixmap, QString()); +} + +/*! + Sets the \a pixmap shown on the label and an \a url. Setting a new + pixmap clears the previous content. When clicking the \a pixmap, \a url + is opened in a browser. If the \a url is a reference to a file, it will + be opened with a suitable application instead of a Web browser. +*/ +void AspectRatioLabel::setPixmapAndUrl(const QPixmap &pixmap, const QString &url) +{ + m_clickableUrl = url; m_pixmap = pixmap; QLabel::setPixmap(scaledPixmap()); } @@ -98,3 +120,28 @@ void AspectRatioLabel::resizeEvent(QResizeEvent *event) if (!m_pixmap.isNull()) QLabel::setPixmap(scaledPixmap()); } + +/*! + \reimp +*/ +void AspectRatioLabel::mousePressEvent(QMouseEvent* event) +{ + Q_UNUSED(event) + if (!m_clickableUrl.isEmpty() && !m_discardMousePress) + QDesktopServices::openUrl(m_clickableUrl); +} + +/*! + \reimp +*/ +bool AspectRatioLabel::event(QEvent *e) +{ + if (e->type() == QEvent::WindowActivate) { + QTimer::singleShot(100, [&]() { + m_discardMousePress = false; + }); + } else if (e->type() == QEvent::WindowDeactivate) { + m_discardMousePress = true; + } + return QLabel::event(e); +} |