Qt: Как последовательно отображать текст на курсоре, независимо от его позиции?
Я хочу, чтобы текст постоянно отображался как всплывающая подсказка, независимо от положения курсора. Это код для отображения текста:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// ...
}
bool Widget::event (QEvent *ev)
{
if (event->type() == QEvent::ToolTip) {
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(ev);
QToolTip::showText(helpEvent->globalPos(), "Something got it");
return false;
}
return QWidget::event(ev);
}
Но когда я запускаю этот код, текст не отображается последовательно, он появляется только иногда, исчезает при перемещении курсора, и все окно мерцает.
1 ответ
Вероятно, вы можете добиться того, чего хотите, перехватывая события движения мыши, а не уведомления всплывающих подсказок ...
class tooltip_event_filter: public QLabel {
using super = QLabel;
public:
tooltip_event_filter ()
{
setWindowFlags(windowFlags()
| Qt::BypassWindowManagerHint
| Qt::FramelessWindowHint
);
}
protected:
virtual bool eventFilter (QObject *obj, QEvent *event) override
{
if (event->type() == QEvent::MouseMove) {
/*
* Note the QPoint(1, 0) offset here. If we don't do that then the
* subsequent call to qApp->widgetAt(QCursor::pos()) will return a
* pointer to this widget itself.
*/
move(QCursor::pos() + QPoint(1, 0));
if (const auto *w = qApp->widgetAt(QCursor::pos())) {
setText(QString("widget@%1").arg((qulonglong)w));
show();
} else {
hide();
}
}
return super::eventFilter(obj, event);
}
};
Затем установите экземпляр
tooltip_event_filter
на экземпляре приложения ...
tooltip_event_filter tooltip_event_filter;
qApp->installEventFilter(&tooltip_event_filter);
В показанном примере просто отображается адрес виджета под указателем мыши при его перемещении.