我正试图显示QAbstractItem的工具提示,但只有当我将鼠标悬停在装饰上时。
如果我设置了Qt::ToolTipRole,那么如果我将鼠标悬停在整个项目上,就会得到工具提示。
对model::data(..(的调用只获取和索引以及角色,因此我无法指定工具提示在其中有效的区域。
以前有人做过这样的事吗?
我也为模型设置了一个委托,并认为我可以使用编辑器事件,但这并没有捕捉到QEvent::Tooltip?
也许只对委托或视图应用一个事件过滤器会有所帮助?
我会使用安装在目标项目视图上的事件过滤器以以下方式完成:
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);
它处理所有工具提示事件,检查装饰上是否发生事件,如果发生,则显示带有文本的工具提示。