Как создать всплывающую подсказку для выделенных строк в 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);
}