在Web浏览器中,当您将鼠标悬停在链接上时,它会变为指向的手.我想在QML中实现同样的目标.

以下是一个QML Text元素,其中包含一个使用HTML标记的文本块,其中包含几个链接:

Text { id: bodyMessage
   anchors.fill: parent
   textFormat: Text.RichText
   wrapMode: Text.WordWrap

   text:
      '<p>' + qsTr('Here is my first paragraph.') + '</p>' +
      '<p>' + qsTr('My second paragraph contains the <a href="link1">first link</a>.') + '</p>' +
      '<p>' + qsTr('My third paragraph contains the <a href="link2">second link</a> and that is it.') + '</p>'

   onLinkActivated:
      (link) =>
      console.log('Link activated to: `' + link + '`')
}

问题是,当鼠标光标位于任一链接上时,它不会更改为指向手.

我try 了一个 children MouseArea,如下所示:

   MouseArea {
      anchors.fill: parent
      hoverEnabled: true

      onPositionChanged:
         (mouse) =>
         cursorShape = bodyMessage.linkAt(mouse.x, mouse.y) ? Qt.PointingHandCursor : Qt.ArrowCursor
   }

这确实会使鼠标光标按需更改,但它会阻止鼠标信号变为Text,因此onLinkActivated不再起作用.

为了解决这个新问题,我在MouseArea的基础上添加了以下内容:

                onClicked:
                    (mouse) =>
                    {
                        let link = bodyMessage.linkAt(mouse.x, mouse.y)
                        if (link.length > 0)
                            console.log('Link activated to: `' + link + '`')
                    }

虽然这确实有效,但它使Text.linkActivated变得过时,这在我看来是错误的方法,代码在我看来也是臃肿的.

推荐答案

你可以考虑在Text的基础上加HoverHandler:

HoverHandler {
    enabled: bodyMessage.hoveredLink
    cursorShape: Qt.PointingHandCursor
}

下面是一个完整的工作示例:

import QtQuick
import QtQuick.Controls
Page {
    title: "HoverHandler Demo"
    Text { id: bodyMessage
        anchors.fill: parent
        textFormat: Text.RichText
        wrapMode: Text.WordWrap
        
        text:
        '<style>' +
        '  a:link { color: red; text-decoration: underline; }' +
        '  a:hover { color: purple; }' +
        '  a:active { color: blue; }' +
        '</style>' +
        '<p>' + qsTr('Here is my first paragraph.') + '</p>' +
        '<p>' + qsTr('My second paragraph contains the <a href="https://stackoverflow.com"> StackOverflow link</a>.') + '</p>' +
        '<p>' + qsTr('My third paragraph contains the <a href="https://www.google.com">Google link</a> and that is it.') + '</p>'
        
        HoverHandler {
            enabled: bodyMessage.hoveredLink
            cursorShape: Qt.PointingHandCursor
        }
        
        onLinkActivated: {
            console.log('Link activated to: `' + link + '`');
            Qt.openUrlExternally(link);
        }
    }
}

你可以Try it Online!

参考资料:

Html相关问答推荐

CSS Flex行之间的空间很大

在CSS中不保持圆形图像形状的边框半径属性

如何使用html和css将两个项目垂直对齐

我应该怎么做才能显示出整个字符串?

当光标悬停在(相同)父元素上方时,为多个子元素创建不同的过渡动画

CSS中的转换属性是如何工作的?

如何在VB.NET中用打印预览和直接打印的方式在Html中打印数据表的内容,包括页眉/设置纸张/方向/适合页面/总计

rmarkdown HTML数字不适用于针织衫_1.44

目标第一个祖先标签的 XPath

带有图像的虚线边框

图像如何能达到 HTML 表格的全宽?

SVG 填充 colored颜色 不使用轮廓填充空白区域

如何垂直对齐列表中的图像和文本?

如何使用 Bootstrap Grid 系统修复大屏幕上图片和进度条之间的空白?

屏幕缩小时背景图像裁剪高度

为什么将 p 元素的垂直边距设置为 1 px 会出现滚动条?

隐藏在标题后面的下拉菜单

使元素扩展宽度减go margin-right

CSS:如何在模糊的背景上剪切文本?

水平滚动框不显示所有元素