Как показать QToolTip при нажатии мыши и оставить его на некоторое время? Qt - PullRequest
2 голосов
/ 31 октября 2019

Попытка показать подсказку о событии нажатия мыши и вызвать ее на некоторое время. Пока он отображается только при нажатии кнопки мыши.

enter image description here

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

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Согласно документации Qt, похоже, что есть альтернативный метод для этой функции:

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

Вы должны указать время, в течение которого отображается подсказка.

РЕДАКТИРОВАТЬ:

Хорошо, похоже, этот метод не работает должным образом с событием mousePress, поэтому есть альтернатива с использованием QTimer:

Добавьте их в свой класс:

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;

А затем внедрите их в свой .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();
    }
}
1 голос
/ 01 ноября 2019

Благодаря ответу @Ian Burns мне удалось создать собственный подход:

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

Каким-то образом, если я показываю всплывающую подсказку внутри метода mousePressEvent, он исчезает сразу после нажатия кнопки мыши. QTimer задерживает всплывающий вызов, и он остается активным в течение разумного времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...