0

我希望光标移动时在光标事件上持续显示文本,而不取决于光标位置。为此,我使用了 Qtooltip。这是显示文本的代码:

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

但是当我运行这段代码时,文本的显示不一致,它有时会显示,移动光标时会消失,整个窗口会闪烁。

4

1 回答 1

0

您可能可以通过拦截鼠标移动事件而不是工具提示通知来实现您想要的......

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

所示示例仅在鼠标指针移动时显示小部件的地址。

于 2021-08-16T08:22:46.717 回答