如何设置QListView项的工具提示持续显示至鼠标移动或指定时长?
解决方案
方案一:设置全局QToolTip显示时长
QWidget::setTooltipDuration()仅作用于单个Widget自身的工具提示,而列表项的工具提示由全局的QToolTip类处理。你可以通过静态方法设置全局工具提示的显示时长,覆盖系统默认限制:
// 在应用初始化时调用,设置为5分钟(300000毫秒) QToolTip::setDuration(300000);
注意:此设置会影响整个应用内所有工具提示的显示时长。
方案二:自定义工具提示窗口(灵活控制,不影响全局)
如果不想修改全局设置,可通过自定义无边框窗口实现完全可控的工具提示,仅在鼠标离开当前项或移动时隐藏:
- 在委托类中添加成员变量:
class MyDelegate : public QStyledItemDelegate { Q_OBJECT private: QWidget* m_tooltipWidget = nullptr; // ... 其他成员 };
- 重写
helpEvent方法:
bool MyDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) { if (event->type() == QEvent::ToolTip) { QVariant toolTipData = view->model()->data(index, Qt::ToolTipRole); if (toolTipData.isValid()) { QString tipText = toolTipData.toString(); if (m_tooltipWidget) { // 更新已有提示的内容和位置 static_cast<QLabel*>(m_tooltipWidget->childAt(0,0))->setText(tipText); m_tooltipWidget->adjustSize(); m_tooltipWidget->move(event->globalPos() + QPoint(10, 10)); m_tooltipWidget->show(); } else { // 创建自定义提示窗口 m_tooltipWidget = new QWidget(view, Qt::ToolTip | Qt::FramelessWindowHint); m_tooltipWidget->setStyleSheet(R"( background-color: #ffffe0; border: 1px solid #cccccc; padding: 4px 6px; )"); QLabel* tipLabel = new QLabel(tipText, m_tooltipWidget); tipLabel->setWordWrap(true); m_tooltipWidget->adjustSize(); m_tooltipWidget->move(event->globalPos() + QPoint(10, 10)); m_tooltipWidget->show(); } return true; } } else if (event->type() == QEvent::Leave || (event->type() == QEvent::MouseMove && !view->indexAt(static_cast<QMouseEvent*>(event)->pos()).isValid())) { // 鼠标离开视图或移动到无项区域时隐藏提示 if (m_tooltipWidget) { m_tooltipWidget->hide(); } } return QStyledItemDelegate::helpEvent(event, view, option, index); }
- 在委托析构时清理窗口:
MyDelegate::~MyDelegate() { delete m_tooltipWidget; }
为什么之前的方法无效?
QToolTip::showText的duration参数在部分平台(如Windows)会被系统级的工具提示设置覆盖,系统默认的短时长优先级更高,导致自定义时长不生效。自定义窗口则完全脱离系统工具提示的限制,可实现任意时长的显示。
内容的提问来源于stack exchange,提问作者Swan AUVERGNE
相关产品推荐
相关产品推荐

