简体   繁体   中英

How to show a QToolTip on mouse press event and leave it popped up for some time? Qt

Trying to show a tool tip on mouse press event and make it popped up for some time. For now it shows only if a mouse button is pressed.

在此处输入图像描述

void ::mousePressEvent(QMouseEvent* e)
{
    if (!m_isLinkingAvailable)
    {
        QToolTip::showText(e->screenPos().toPoint(),
            tr("Symbol Linking\navailable only for Price"), this);
    }
}

According to the Qt Docs, looks like there's an alternate method for this function:

void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect, int msecDisplayTime )

You should be able to specify a time for how long to display the tooltip.

EDIT:

Okay so seems like this method doesn't work as expected with a mousePress event, so here's an alternative using a QTimer:

Add these to your class:

MyConstructor(...params...)
        , m_tooltipTimer(new QTimer(this)) // don't forget this line
    {
        connect(m_tooltipTimer, SIGNAL(timeout()), this, SLOT(updateTooltip()));
        setAcceptedMouseButtons(Qt::AllButtons);
    }

...

public slots:
    void mousePressEvent(QMouseEvent *event) override;
    void updateTooltip();

...

private:
    QPoint m_tooltipPos;
    qint64 m_tooltipTimerStart;
    QTimer *m_tooltipTimer;

And then implement these in your.cpp

void ::mousePressEvent(QMouseEvent *event) {
    m_tooltipTimer->start(200); // 5x per second, automatically resets timer if already started
    m_tooltipTimerStart = QDateTime::currentMSecsSinceEpoch();
    m_tooltipPos = event->globalPos();
    event->accept();
}

void ::updateTooltip() {
    auto howLongShown = QDateTime::currentMSecsSinceEpoch() - m_tooltipTimerStart; // startTime here is the moment of first showing of the tooltip
    qDebug() << howLongShown;
    if (howLongShown < 1000) { // 1 sec
        QToolTip::showText(m_tooltipPos, tr("Test Tooltip")); // Replace this with your own
    } else {
        QToolTip::hideText();
        m_tooltipTimer->stop();
    }
}

Thanks to @Ian Burns's answer I have manged to create own approach:

void ::mousePressEvent(QMouseEvent*)
{
    QTimer::singleShot(200, [this]()
        {
            QToolTip::showText(mapToGlobal({}),
                tr("Symbol Linking\navailable only for Price"), this);
        });
}

Somehow if I show a tooltip inside mousePressEvent method it disappears immediately after I unpress the mouse button. QTimer delays the pop up call and it stays popped for reasonable time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM