Я бы сделал это следующим образом, используя фильтр событий, установленный в представлении целевых элементов:
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);
Он обрабатывает все события всплывающей подсказки, проверяет, происходит ли событие на декорации и, если да, показывает подсказку с текстом.