Как создать всплывающую подсказку для выделенных строк в QplainTextEdit QT

У меня есть QPlainTextEdit, и теперь в нем выделены некоторые слова. Я хочу, чтобы при наведении на него курсора мыши отображалась всплывающая подсказка с описанием или чем-то подобным об этом выделенном слове, что-то вроде этого в QT IDE.

но я не знаю, как начать это, так что любая идея, код или подобный проект, чтобы проверить это
заранее спасибо

1 ответ

Решение

Для этого случая я создам класс, который наследуется от QPlainTextEdit, переопределив event() метод и включить отслеживание мыши с setMouseTracking()

plaintextedit.h

#ifndef PLAINTEXTEDIT_H
#define PLAINTEXTEDIT_H

#include <QPlainTextEdit>

class PlainTextEdit : public QPlainTextEdit
{
public:
    PlainTextEdit(QWidget *parent=0);

    bool event(QEvent *event);
};

#endif // PLAINTEXTEDIT_H

plaintextedit.cpp

#include "plaintextedit.h"
#include <QToolTip>


PlainTextEdit::PlainTextEdit(QWidget *parent):QPlainTextEdit(parent)
{
    setMouseTracking(true);
}

bool PlainTextEdit::event(QEvent *event)
{
    if (event->type() == QEvent::ToolTip)
    {
        QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);
        QTextCursor cursor = cursorForPosition(helpEvent->pos());
        cursor.select(QTextCursor::WordUnderCursor);
        if (!cursor.selectedText().isEmpty())
            QToolTip::showText(helpEvent->globalPos(), /*your text*/QString("%1 %2").arg(cursor.selectedText()).arg(cursor.selectedText().length()) );

        else
            QToolTip::hideText();
        return true;
    }
    return QPlainTextEdit::event(event);
}

Полный код: здесь

Ответ @eyllanesc отличный, но я хотел бы добавить, что если у вас установлены поля окна просмотра, позиция должна быть скорректирована, потому что в противном случае она будет смещена, и будет сообщено о неправильной позиции курсора.

Документ для cursorForPosition() состояния

возвращает QTextCursor в позиции pos (в координатах области просмотра). акцент добавлен

bool PlainTextEdit::event(QEvent *event)
{
    if (event->type() == QEvent::ToolTip)
    {
        QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);
        
        QPoint pos = helpEvent->pos();
        pos.setX(pos.x() - viewportMargins().left());
        pos.setY(pos.y() - viewportMargins().top());
        
        QTextCursor cursor = cursorForPosition(pos);
        cursor.select(QTextCursor::WordUnderCursor);
        if (!cursor.selectedText().isEmpty())
            QToolTip::showText(helpEvent->globalPos(), /*your text*/QString("%1 %2").arg(cursor.selectedText()).arg(cursor.selectedText().length()) );

        else
            QToolTip::hideText();
        return true;
    }
    return QPlainTextEdit::event(event);
}

Другие вопросы по тегам