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);

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

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