From 63354e0d097116138e7d998a01194f5ee502117a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Martsum?= Date: Wed, 15 May 2013 21:23:30 +0200 Subject: [PATCH] QToolTip - add static showText with time. It is nice to be able to control how long time a tooltip is shown. This is the first part of solving: Task-number: QTBUG-1016 Change-Id: I8e313df8a2acdc5ccc91d9c8ce956c30c76daf4b Reviewed-by: David Faure (KDE) --- src/widgets/kernel/qtooltip.cpp | 36 +++++++--- src/widgets/kernel/qtooltip.h | 2 + tests/manual/widgets/kernel/kernel.pro | 3 + tests/manual/widgets/kernel/qtooltip/main.cpp | 67 +++++++++++++++++++ tests/manual/widgets/kernel/qtooltip/main.pro | 2 + tests/manual/widgets/widgets.pro | 3 +- 6 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 tests/manual/widgets/kernel/kernel.pro create mode 100644 tests/manual/widgets/kernel/qtooltip/main.cpp create mode 100644 tests/manual/widgets/kernel/qtooltip/main.pro diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp index 864ed6a555..8399f94976 100644 --- a/src/widgets/kernel/qtooltip.cpp +++ b/src/widgets/kernel/qtooltip.cpp @@ -120,7 +120,7 @@ class QTipLabel : public QLabel { Q_OBJECT public: - QTipLabel(const QString &text, QWidget *w); + QTipLabel(const QString &text, QWidget *w, int msecDisplayTime); ~QTipLabel(); static QTipLabel *instance; @@ -130,11 +130,11 @@ public: bool fadingOut; - void reuseTip(const QString &text); + void reuseTip(const QString &text, int msecDisplayTime); void hideTip(); void hideTipImmediately(); void setTipRect(QWidget *w, const QRect &r); - void restartExpireTimer(); + void restartExpireTimer(int msecDisplayTime); bool tipChanged(const QPoint &pos, const QString &text, QObject *o); void placeTip(const QPoint &pos, QWidget *w); @@ -166,7 +166,7 @@ private: QTipLabel *QTipLabel::instance = 0; -QTipLabel::QTipLabel(const QString &text, QWidget *w) +QTipLabel::QTipLabel(const QString &text, QWidget *w, int msecDisplayTime) #ifndef QT_NO_STYLE_STYLESHEET : QLabel(w, Qt::ToolTip | Qt::BypassGraphicsProxyWidget), styleSheetParent(0), widget(0) #else @@ -187,17 +187,19 @@ QTipLabel::QTipLabel(const QString &text, QWidget *w) setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0, this) / 255.0); setMouseTracking(true); fadingOut = false; - reuseTip(text); + reuseTip(text, msecDisplayTime); } -void QTipLabel::restartExpireTimer() +void QTipLabel::restartExpireTimer(int msecDisplayTime) { int time = 10000 + 40 * qMax(0, text().length()-100); + if (msecDisplayTime > 0) + time = msecDisplayTime; expireTimer.start(time, this); hideTimer.stop(); } -void QTipLabel::reuseTip(const QString &text) +void QTipLabel::reuseTip(const QString &text, int msecDisplayTime) { #ifndef QT_NO_STYLE_STYLESHEET if (styleSheetParent){ @@ -215,7 +217,7 @@ void QTipLabel::reuseTip(const QString &text) if (fm.descent() == 2 && fm.ascent() >= 11) ++extra.rheight(); resize(sizeHint() + extra); - restartExpireTimer(); + restartExpireTimer(msecDisplayTime); } void QTipLabel::paintEvent(QPaintEvent *ev) @@ -439,6 +441,18 @@ bool QTipLabel::tipChanged(const QPoint &pos, const QString &text, QObject *o) */ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect) +{ + showText(pos, text, w, rect, -1); +} + +/*! + \since 5.2 + \overload + This is similar to QToolTip::showText(\a pos, \a text, \a w, \a rect) but with an extra parameter \a msecDisplayTime + that specifies how long the tool tip will be displayed, in milliseconds. +*/ + +void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect, int msecDisplayTime) { if (QTipLabel::instance && QTipLabel::instance->isVisible()){ // a tip does already exist if (text.isEmpty()){ // empty text means hide current tip @@ -452,7 +466,7 @@ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, cons if (w) localPos = w->mapFromGlobal(pos); if (QTipLabel::instance->tipChanged(localPos, text, w)){ - QTipLabel::instance->reuseTip(text); + QTipLabel::instance->reuseTip(text, msecDisplayTime); QTipLabel::instance->setTipRect(w, rect); QTipLabel::instance->placeTip(pos, w); } @@ -462,11 +476,11 @@ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, cons if (!text.isEmpty()){ // no tip can be reused, create new tip: #ifndef Q_WS_WIN - new QTipLabel(text, w); // sets QTipLabel::instance to itself + new QTipLabel(text, w, msecDisplayTime); // sets QTipLabel::instance to itself #else // On windows, we can't use the widget as parent otherwise the window will be // raised when the tooltip will be shown - new QTipLabel(text, QApplication::desktop()->screen(QTipLabel::getTipScreen(pos, w))); + new QTipLabel(text, QApplication::desktop()->screen(QTipLabel::getTipScreen(pos, w)), msecDisplayTime); #endif QTipLabel::instance->setTipRect(w, rect); QTipLabel::instance->placeTip(pos, w); diff --git a/src/widgets/kernel/qtooltip.h b/src/widgets/kernel/qtooltip.h index 25b138b855..ccde405342 100644 --- a/src/widgets/kernel/qtooltip.h +++ b/src/widgets/kernel/qtooltip.h @@ -53,8 +53,10 @@ class Q_WIDGETS_EXPORT QToolTip { QToolTip() Q_DECL_EQ_DELETE; public: + // ### Qt 6 - merge the three showText functions below static void showText(const QPoint &pos, const QString &text, QWidget *w = 0); static void showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect); + static void showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect, int msecShowTime); static inline void hideText() { showText(QPoint(), QString()); } static bool isVisible(); diff --git a/tests/manual/widgets/kernel/kernel.pro b/tests/manual/widgets/kernel/kernel.pro new file mode 100644 index 0000000000..4d26c9ee19 --- /dev/null +++ b/tests/manual/widgets/kernel/kernel.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS = qtooltip + diff --git a/tests/manual/widgets/kernel/qtooltip/main.cpp b/tests/manual/widgets/kernel/qtooltip/main.cpp new file mode 100644 index 0000000000..d8621de6db --- /dev/null +++ b/tests/manual/widgets/kernel/qtooltip/main.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Thorbjørn Lund Martsum - tmartsum[at]gmail.com +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +void showSomeToolTips() +{ + QPoint p(100 + 20, 100 + 20); + + for (int u = 1; u < 20; u += 5) { + QString s = "Seconds: " + QString::number(u); + QToolTip::showText(p, s, 0, QRect(), 1000 * u); + QTest::qWait((u + 1) * 1000); + } + + QToolTip::showText(p, "Seconds: 2", 0, QRect(), 2000); + QTest::qWait(3000); + + QToolTip::showText(p, "Standard label", 0, QRect()); + QTest::qWait(12000); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + showSomeToolTips(); + return 0; +} diff --git a/tests/manual/widgets/kernel/qtooltip/main.pro b/tests/manual/widgets/kernel/qtooltip/main.pro new file mode 100644 index 0000000000..dac880a10e --- /dev/null +++ b/tests/manual/widgets/kernel/qtooltip/main.pro @@ -0,0 +1,2 @@ +SOURCES = main.cpp +QT += widgets testlib diff --git a/tests/manual/widgets/widgets.pro b/tests/manual/widgets/widgets.pro index 4e2e4c7cee..e9dcdf39e7 100644 --- a/tests/manual/widgets/widgets.pro +++ b/tests/manual/widgets/widgets.pro @@ -1,2 +1,3 @@ TEMPLATE = subdirs -SUBDIRS = itemviews qgraphicsview +SUBDIRS = itemviews qgraphicsview kernel +