QAbstractItemModel装饰工具提示

时间:2018-11-08 12:07:22

标签: qt tooltip qabstractitemmodel

我试图显示QAbstractItem的工具提示,但仅当我将鼠标悬停在装饰上时。

如果我设置了Qt :: ToolTipRole,那么当我将鼠标悬停在整个项目上时,会得到工具提示。

对model :: data(..)的调用仅具有索引和作用,因此我无法指定工具提示在其中有效的区域。

有人以前做过类似的事情吗?

我也为模型设置了一个委托,并认为我可以使用editor事件,但不能捕获QEvent :: Tooltip吗?

也许仅将事件过滤器应用于委托或视图可能会有所帮助?

1 个答案:

答案 0 :(得分:1)

我将通过以下方式使用目标项目视图上安装的事件过滤器来做到这一点:

class Filter : public QObject
{
protected:
  bool eventFilter(QObject * watched, QEvent * event) override
  {
    if (auto view = qobject_cast<QAbstractItemView *>(watched)) {
      if (event->type() == QEvent::ToolTip) {
        auto helpEvent = static_cast<QHelpEvent *>(event);
        auto pos = view->viewport()->mapFrom(view, helpEvent->pos());
        auto index = view->indexAt(pos);

        // Assuming that the decoration size is 16x16
        auto rect = QRect(view->visualRect(index).topLeft(), QSize(16, 16));
        if (rect.contains(pos)) {
          QToolTip::showText(helpEvent->globalPos(), "This is a tooltip");
        }
      }
    }
    return false;
  }
};

在视图上安装此过滤器:

QTreeWidget tw;
auto item = new QTreeWidgetItem(&tw, QStringList() << "Test");
item->setIcon(0, QIcon("icon.png"));

Filter filter;
tw.installEventFilter(&filter);

它处理所有工具提示事件,检查装饰上是否发生事件,如果是,则显示带有文本的工具提示。