You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置QListView项的工具提示持续显示至鼠标移动或指定时长?

解决方案

方案一:设置全局QToolTip显示时长

QWidget::setTooltipDuration()仅作用于单个Widget自身的工具提示,而列表项的工具提示由全局的QToolTip类处理。你可以通过静态方法设置全局工具提示的显示时长,覆盖系统默认限制:

// 在应用初始化时调用,设置为5分钟(300000毫秒)
QToolTip::setDuration(300000);

注意:此设置会影响整个应用内所有工具提示的显示时长。

方案二:自定义工具提示窗口(灵活控制,不影响全局)

如果不想修改全局设置,可通过自定义无边框窗口实现完全可控的工具提示,仅在鼠标离开当前项或移动时隐藏:

  1. 在委托类中添加成员变量:
class MyDelegate : public QStyledItemDelegate {
    Q_OBJECT
private:
    QWidget* m_tooltipWidget = nullptr;
    // ... 其他成员
};
  1. 重写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);
}
  1. 在委托析构时清理窗口:
MyDelegate::~MyDelegate() {
    delete m_tooltipWidget;
}

为什么之前的方法无效?

QToolTip::showText的duration参数在部分平台(如Windows)会被系统级的工具提示设置覆盖,系统默认的短时长优先级更高,导致自定义时长不生效。自定义窗口则完全脱离系统工具提示的限制,可实现任意时长的显示。


内容的提问来源于stack exchange,提问作者Swan AUVERGNE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:12:34