Qt 4.8中调用setToolTip后,如何更新已显示的工具提示?
在Qt 4.8中更新已显示的QTreeWidgetItem工具提示
要解决已显示的工具提示不即时更新的问题,核心是先更新item存储的工具提示文本,再主动刷新当前正在显示的tooltip窗口,具体实现步骤如下:
- 第一步,正常调用
QTreeWidgetItem::setToolTip()更新item的工具提示内容,确保后续鼠标再次触发时能获取到新文本。 - 第二步,获取当前活跃的弹出窗口(即正在显示的tooltip),判断它是否属于QToolTip类:
QWidget* activePopup = QApplication::activePopupWidget(); if (activePopup && activePopup->inherits("QToolTip")) { - 第三步,验证当前tooltip是否对应目标item:通过鼠标全局位置,判断它是否落在目标item的可视区域内(需将item的本地坐标转换为全局坐标):
QTreeWidget* treeWidget = targetItem->treeWidget(); QRect itemGlobalRect = treeWidget->mapToGlobal(treeWidget->visualItemRect(targetItem)); QPoint cursorPos = QCursor::pos(); if (itemGlobalRect.contains(cursorPos)) { - 第四步,调用
QToolTip::showText()刷新tooltip内容——这个方法在tooltip已显示时会自动更新文本和位置:QToolTip::showText(cursorPos, targetItem->toolTip(column), treeWidget);
完整代码片段示例:
void updateItemToolTip(QTreeWidgetItem* targetItem, int column, const QString& newTip) { // 更新item存储的tooltip文本 targetItem->setToolTip(column, newTip); // 获取当前活跃的tooltip窗口 QWidget* activePopup = QApplication::activePopupWidget(); if (!activePopup || !activePopup->inherits("QToolTip")) { return; } // 检查鼠标是否在目标item范围内,确保tooltip属于当前item QTreeWidget* treeWidget = targetItem->treeWidget(); if (!treeWidget) { return; } QRect itemLocalRect = treeWidget->visualItemRect(targetItem); QRect itemGlobalRect = treeWidget->mapToGlobal(itemLocalRect); QPoint cursorPos = QCursor::pos(); if (!itemGlobalRect.contains(cursorPos)) { return; } // 刷新已显示的tooltip QToolTip::showText(cursorPos, newTip, treeWidget); }
注意事项:
- 上述方法依赖的
QApplication::activePopupWidget()和QToolTip::showText()接口在Qt 4.8中均兼容可用。 - 如果工具提示是针对整个item而非某一列,可省略
column参数,直接调用setToolTip(const QString&)。
内容的提问来源于stack exchange,提问作者Andreas Haferburg
相关产品推荐
相关产品推荐

