QML实现Label的文字选择与右键各操作

2023-10-26

QML中,原生的Label是不能够进行鼠标的选中,复制,全选等操作的,仅仅只能用于简单的展示文字,但是在实际开发中,往往我们需要给用户展示一些信息,而且要支持可以用鼠标进行选择文字,并进行复制操作,所以,用QML中的Label控件显然是不行的,因此考虑重写控件实现以上功能:

import QtQuick 2.2
import QtQuick.Controls 1.2
 
Rectangle {
    id: root
    width: 300
    height: 300
 
    Label {
        id: lab_name
        anchors{
            left: parent.left
            leftMargin: 30
            top: parent.top
            topMargin: 50
        }
        font.pixelSize: 16
        text: "姓名:"
    }
 
    TextArea {
        id: lbl_name_show
        anchors{
            left:lab_name.right
            top:lab_name.top
        }
        verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff
        implicitHeight: lab_name.height
        antialiasing: true
        readOnly: true
        frameVisible : false
        backgroundVisible : false
        contentItem : TextArea{
            id: lab_txt
            text:"三个程序员"
            readOnly: true
            font.pixelSize: 16
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 4
            frameVisible : false
            backgroundVisible : false
        }
        MouseArea {
            id: mouse_area
            anchors.fill: parent
            hoverEnabled: true
            acceptedButtons: Qt.MiddleButton
            onEntered: {
                tool_tip.text = lab_txt.text
                tool_tip.onVisibleStatus(true)
            }
            onExited: {
                tool_tip.text = ""
                tool_tip.onVisibleStatus(false)
            }
            onPositionChanged: {
                tool_tip.mouserHover(lbl_name_show, mouseX, mouseY)
            }
        }
        visible: true
    }
    Tooltip {
        id: tool_tip
    }
}

以上就是实现对 Label功能的重写,以实现信息的展示、选中文字,选中复制和全选等右键操作与键盘快捷键ctrl+c复制操作,可以看出,其实是利用了QML的TextArea 的本身右键功能,但是TextArea 是有边框背景等属性的,所以去掉了TextArea 的边框和背景:

frameVisible : false

backgroundVisible : false

并且设置为只读属性:readOnly: true。

切记,还要去掉TextArea的自带滚动条属性:verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff,否则,滚动条就会出现在文字的右边。

还要对其implicitHeight进行设值,使得具有Label的效果。

但是如果仅仅利用TextArea就替代Label,那Qt就不需要有Label控件了,因此,并没有那么简单,如果仅仅设置了以上属性,当鼠标放到TextArea中时,可以看到是有轻微滚动的,这是因为虽然设置了verticalScrollBarPolicy:Qt.ScrollBarAlwaysOff属性,但是这仅仅是不显示滚动条,内容仍然是可以滚动的,考虑到TextArea是继承自ScrollView的(Inherits: ScrollView,详情查看帮助),因此可以设置contentItem属性以改变显示内容,由于显示的内容即为要进行鼠标操作(选择,复制等操作)的内容,因此,也用TextArea对其内容进行显示,并且支持鼠标操作,完成的父TextArea只起到一个控件占位的作用,以上,就实现了文字的显示以及选择与右键各操作了,其效果如下:


这里有一个细节,即对contentItem的TextArea设置了anchors.bottom和anchors.bottomMargin属性,如果不设置,其效果如下:

 

设置后,效果如下:

 

当然,我的截图中增加了其tooltip,以解决文字过长显示不全的问题,这里又有一个技巧,就是MouseArea的使用技巧,当进入是显示tooltip提示,退出区域时不显示tooltip提示,可是MouseArea会优先得到鼠标事件,这阻挡了TextArea捕捉鼠标,就会使得鼠标的选中文字不起作用,选中不了文字,鼠标事件只走到MouseArea就停止了,因此我们可以利用MouseArea的一个acceptedButtons属性,设置acceptedButtons: Qt.MiddleButton使得MouseArea只接收鼠标的中建而不接受左键和右键,这样,TextArea就可正常处理鼠标的选中文字与右键菜单的弹出了,至此,问题完美解决。

至于tooltip的实现,可以用QML的Window进行重写控件,实现其功能。

 

 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML实现Label的文字选择与右键各操作 的相关文章

  • 如何从js文件中包含qml文件

    我收集一些例子 https github com drzhbe QmlTxt blob master Import md of importQML 中的声明 但还缺少一个 从 js 文件导入 qml 文件 文档says http doc q
  • vb.net 复选框标签位置

    有没有办法将复选框放在 asp 复选框标签的右侧 默认情况下 此代码放置复选框 然后放置标签
  • iOS 和 Android 中的照片库

    我正在开发一个用于移动设备运行的应用程序iOS and Android我在访问时遇到一些困难image gallery的设备与Qml 我需要在一个中列出图片库中的图像GridView 我尝试使用返回图片文件夹QStandardPaths但它
  • 单击标签未打开选择

    我一直以为 点击label将或多或少地 触发 相应表单元素的点击 然而 这似乎不起作用select 选择字段上的鼠标按下 动画有效 但选择未打开 我试过这个
  • 子窗口中的 ListView 触发立即关闭,或在滚动时触发

    我有一个相当奇怪的场景 如果我启动一个包含ListView如果有一个中等复杂的委托和足够的项目来轻松超出可见区域 整个子窗口将在启动时立即关闭 降低委托的复杂性将允许窗口打开 但随后快速滚动窗口ListView会强行关闭它 This SSC
  • QML - 不支持命令式代码

    有人可以评论这个事实吗QML 任何命令式JavaScript代码不会被执行 除非它是额外组件 http blog qt digia com blog 2011 05 05 qt quick designer in qt creator 2
  • 在格子 xyplot 上添加标签

    我创建了一个带有格子的 xyplot library lattice X1 c 5 2 1 3 X2 X1 2 names paste dot 1 4 sep xyplot X2 X1 data data frame X1 X2 pch 2
  • ShaderEffectItem 的奇怪 alpha 混合结果

    我正在尝试使用以下方法在 QML 项目上应用简单的 alpha 蒙版ShaderEffectItem 这是一个最小的 非 工作示例 我有一个从红到白的渐变作为背景 并且想要在其顶部绘制一个绿色的 200x200 正方形 该正方形的 alph
  • 如何在QML中设置弹出菜单位置

    我想修复 QML 中弹出菜单的位置 当我单击设置按钮时 我希望弹出菜单将显示在固定位置 我用了一天的时间就做到了 但是做不到 我怎样才能在 QML 中做到这一点 另外 我想更改菜单项的大小 宽度和高度 希望您的帮助 这取决于QtQuick
  • R 中的旋转轴标签

    如何使 条形 图的 y 轴标签平行于 X 轴而不是平行于 Y 轴 不确定这是否是您的意思 但尝试设置las 1 这是一个例子 require grDevices tN lt table Ni lt stats rpois 100 lambd
  • 用面向对象的方法设置标签元素的属性

    标签有一个 for 属性 使它们指向某个输入字段 我需要使用 JQuery 更改此属性的值 以便我可以使用 label attr for targetName 但我还需要设置 className 所以我更喜欢使用 label attr fo
  • 如何使用 qt 在键盘上仅显示数字

    我在我的项目中使用 Qt Quick Virtual Keyboard 当我单击一个对象时 我想显示键盘但只显示数字 我怎样才能做到这一点 这就是我想做的 您可以使用Qt ImhFormattedNumbersOnly http doc q
  • igraph (R) 中仅在根和终端顶点上添加标签?

    inst2 c 2 3 4 5 6 motherinst2 c 7 8 2 10 11 km c 20 30 40 25 60 df2 data frame inst2 motherinst2 df2 cbind df2 km g2 gra
  • Qt QML ComboBox 覆盖滚轮事件

    有没有办法覆盖 ComboBox MouseArea 以忽略滚轮事件而不是更改当前索引 ComboBox 本身没有选项可以更改滚轮焦点行为 到目前为止 我尝试使用如下代码覆盖 CB MouseArea 的 onWheel ComboBox
  • 以编程方式创建 UILabel

    我通过代码执行了以下操作 UILabel label UILabel alloc initWithFrame CGRectMake 40 70 300 50 label backgroundColor UIColor clearColor
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • PySide2/QML 填充 Gridview 模型/委托并为其设置动画

    我是 QML 的新手 正在寻求以下几点帮助 如何基于 TextField 输入 如 Regex 通过 PySide2 过滤 Gridview 模型中的 QAbstractListModel 数据 标题 如何在鼠标悬停时为 Gridview
  • 通过对 XmlHttpRequest (REST) 的响应在 QML 中显示图像

    我需要从 REST API 调用中获取 jpeg 图像 我使用 XMLHttpRequest 因为请求需要身份验证标头 即我不能只创建一个图像并将源设置为带有 user passwd url 的 URL 我认为我可以通过将 REST 数据设
  • QML 项目的 QtCreator 中未启用“运行”按钮

    我在Windows XP上使用基于QT 4 7 4 32位 的QTCreator 2 2 1 我从 new gt QML 项目菜单创建了一个 QML 项目 但 RUN 按钮未启用 如何运行 QML 项目 您是否创建了新的 QML 文件而不是
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF

随机推荐