【问题标题】:Qt: How to display a text consistently on the cursor, not depending on cursor position?Qt:如何在光标上一致地显示文本,而不取决于光标位置?
【发布时间】:2021-10-15 22:53:34
【问题描述】:

我希望在光标移动时在光标事件上持续显示文本,而不是取决于光标位置。为此,我使用了 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);
}

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

【问题讨论】:

  • 但是工具提示的标准是在光标位置显示。请编辑您的问题以准确说明您期望的行为。
  • @Baumflaum 我怀疑问题是工具提示在光标位置弹出并保持静止直到它消失,而 OP 希望工具提示小部件跟踪鼠标移动,文本随着小部件不断更新进入/离开。也许OP可以澄清。
  • 请详细说明“一致地显示文本”的含义。这绝对不清楚。
  • 您没有尝试在鼠标移动等其他事件处理程序上显示工具提示吗?
  • 无论光标位置在哪里,我都需要不断地在光标上显示准确的文本。我需要文本随着屏幕上的光标移动。 QTooltip 方法仅在特定位置或当鼠标悬停在小部件上发生事件时显示文本。但我需要的是在光标在 Qwindow 上移动时在光标附近显示一个常量文本。

标签: qt qevent qtooltip


【解决方案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);

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

【讨论】:

  • 感谢代码运行良好,但是当我在 main.cpp 中安装实例时。在这种情况下,会显示文本,但按钮等小部件不起作用。另外,如果我在小部件类中安装实例,它根本不起作用!
  • 不确定我是否理解这种行为。我将显示的代码添加到我的一些日常应用程序中,它的行为似乎符合预期。如果您想要一个应该安装在单个小部件上的事件过滤器,那么看起来会略有不同。它需要拦截进入和离开事件,并且需要为所有感兴趣的小部件启用mouse tracking
  • 我的小部件在 QpieSeries 中包含 Qpieslice。我需要在将鼠标悬停在切片上时显示切片的值。我需要一个工具提示来显示鼠标悬停在其上的当前切片的值。此外,只要光标位于切片上,工具提示就应不断显示其值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多