QML ToolTip 组件:延迟提示与自定义外观

ToolTip 是 QML 里给控件加悬停提示的附加类型。这篇文章讲基础用法和自定义样式。

  • 基础 Tooltip --- 延迟、超时与悬停触发
  • 自定义样式 --- 用 contentItembackground 改外观

基础 Tooltip

悬停在蓝色矩形上,500ms 后弹出提示,5s 后自动消失。

演示代码

qml 复制代码
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

FadeInAnimation {
    ColumnLayout {
        anchors.fill: parent
        anchors.margins: 20
        spacing: 15

        TitleSeparator {
            title: "基础 Tooltip"
            description: "使用 ToolTip 附加类型在悬停时展示提示,可设置延迟与超时时间"
        }

        RowLayout {
            Layout.preferredHeight: 120
            Layout.alignment: Qt.AlignHCenter
            spacing: 20

            Rectangle {
                Layout.preferredWidth: 120
                Layout.preferredHeight: 40
                color: "lightblue"
                radius: 4

                Text {
                    anchors.centerIn: parent
                    text: "基础 Tooltip"
                }

                ToolTip {
                    text: "这是一个基础的tooltip示例"
                    delay: 500
                    timeout: 5000
                    visible: basicMA.hovered
                }

                HoverHandler {
                    id: basicMA
                }
            }
        }

        Item { Layout.fillHeight: true }
    }
}

关键逻辑解析

  • ToolTip 作为附加类型直接写在目标控件内部。
  • visible: basicMA.hovered 绑定到 HoverHandlerhovered 属性,控制显示时机。
  • delay: 500 表示悬停 500ms 后才显示;timeout: 5000 表示显示 5s 后自动隐藏。

适用场景:按钮提示、图标说明、表单字段解释。

自定义样式

悬停在绿色矩形上,显示蓝色背景、白色粗体文字的 Tooltip。

演示代码

qml 复制代码
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

FadeInAnimation {
    ColumnLayout {
        anchors.fill: parent
        anchors.margins: 20
        spacing: 15

        TitleSeparator {
            title: "自定义样式"
            description: "通过自定义 contentItem 与 background 定制 Tooltip 的文字与背景外观"
        }

        RowLayout {
            Layout.preferredHeight: 120
            Layout.alignment: Qt.AlignHCenter
            spacing: 20

            Rectangle {
                Layout.preferredWidth: 120
                Layout.preferredHeight: 40
                color: "lightgreen"
                radius: 4

                Text {
                    anchors.centerIn: parent
                    text: "自定义样式"
                }

                ToolTip {
                    id: customTooltip
                    text: "这是一个自定义样式的tooltip"
                    delay: 500
                    timeout: 5000
                    visible: customMA.hovered

                    contentItem: Text {
                        text: customTooltip.text
                        font.bold: true
                        color: "white"
                    }

                    background: Rectangle {
                        color: "#2196F3"
                        radius: 6
                        border.color: "#1976D2"
                        border.width: 1
                    }
                }

                HoverHandler {
                    id: customMA
                }
            }
        }

        Item { Layout.fillHeight: true }
    }
}

关键逻辑解析

  • contentItem 替换 Tooltip 的文本区域,可以改字体、颜色、对齐方式。
  • background 替换 Tooltip 的背景,支持圆角、边框、渐变色。
  • 文字内容仍通过 text 属性设置,contentItem 里引用 customTooltip.text

适用场景:统一 UI 风格、深色模式提示、品牌色提示框。

运行验证

  1. Qt Creator 打开 qml_tooltip/CMakeLists.txt
  2. Ctrl+R 运行;
  3. 分别悬停在两个矩形上,观察延迟、样式变化。

扩展复用方向

  • 把 ToolTip 封装成独立组件,统一项目内的提示风格。
  • MouseArea 代替 HoverHandler,支持点击触发提示。

已验证环境

相关推荐
秋田君21 小时前
QT_JSON文件操作
开发语言·qt·json
大白同学42121 小时前
初识Qt——信号和槽
开发语言·qt
秋田君1 天前
QT_INI文件操作
开发语言·qt
≮傷£≯√1 天前
FFmpeg + qt 音频播放
qt·ffmpeg·音视频
youqingyike1 天前
【无标题】
前端·qt
程序员老陆1 天前
Qt::WidgetAttribute 常用属性详解
开发语言·qt
程序员老陆2 天前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
Quz2 天前
QML TextArea 入门(二):富文本与换行模式
qt
大白同学4212 天前
初识Qt——创建第一个Qt项目
开发语言·qt
秋田君2 天前
QT_绘图原理双缓冲机制
服务器·数据库·qt