QAbstractItemModel Декорация Подсказка - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь отобразить всплывающую подсказку для QAbstractItem, но только при наведении курсора на украшение.

Если я установлю Qt :: ToolTipRole, я получу всплывающую подсказку, если наведу курсор на весь элемент.

Призыв к модели :: данным (..) принимает только индекс и роль, поэтому я не могу указать область, в которой подсказка должна быть действительной.

Кто-нибудь успел сделать что-то подобное раньше?

У меня также есть делегат, настроенный для модели, и я подумал, что могу использовать событие редактора, но это не перехватывает QEvent :: Tooltip?

Возможно, может помочь только фильтр событий, примененный к делегату или представлению?

1 Ответ

0 голосов
/ 08 ноября 2018

Я бы сделал это следующим образом, используя фильтр событий, установленный в представлении целевых элементов:

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

Он обрабатывает все события всплывающей подсказки, проверяет, происходит ли событие на декорации и, если да, показывает подсказку с текстом.

...