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的文字选择与右键各操作 的相关文章

  • 使用不带标签的 Core.Std.List.fold_left

    我正在尝试 Core 的List fold left List fold left a Core Std List t gt init b gt f b gt a gt b gt b
  • 使用 KDE Kirigami 时未找到 QML 模块

    所以我决定在我的应用程序中使用 KDE Kirigami UI 框架 所以我按照说明进行操作here https api kde org frameworks kirigami html index html 我将存储库克隆到我的应用程序目
  • 在Python中单击按钮时隐藏标签

    在 Python Tkinter 中单击按钮时如何隐藏现有标签 这实际上取决于您使用的几何管理器 如果你使用 lbl Tkinter Label parent 要创建标签 您将使用以下方法之一来隐藏它 lbl grid forget lbl
  • Qt QML ComboBox 覆盖滚轮事件

    有没有办法覆盖 ComboBox MouseArea 以忽略滚轮事件而不是更改当前索引 ComboBox 本身没有选项可以更改滚轮焦点行为 到目前为止 我尝试使用如下代码覆盖 CB MouseArea 的 onWheel ComboBox
  • QML 适合所有分辨率的屏幕

    大家好 我的 QML 代码有问题 我犯了一个错误 我给元素设置了一定的大小 现在我在将应用程序放在其他设备上时遇到了问题 我会将我的代码粘贴到有宽度和高度的位置 以便您可以更改它以向我展示如何使用动态调整大小 我需要说我正在使用以下代码从
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js
  • 将项目添加到自定义组件的布局

    我有一个习惯Footer Component我想在 QML 应用程序的不同位置重用它 Rectangle color gold height 50 anchors bottom parent bottom left parent left
  • 如何将 igraph 中的边标签与边分开?

    我想移动边缘标签的位置 使其不在其上方 这是一个小例子 g lt graph empty n 3 g lt graph c 1 2 3 2 1 3 directed T E g weight lt c 3 2 5 plot g edge l
  • 在 Qt Creator 中相互公开 QML 组件

    我正在使用 Qt Quick 和 PySide2 开发仪表板应用程序 但在 Qt Creator 的设计模式中公开我的 QML 组件时遇到问题 我的文件夹结构如下所示 myapp mycomponents component1 qml co
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何将枚举类传递给 QML?

    我正在学习QML with Qt并在通过时遇到一些麻烦enum class to qml 当我使用信号时int参数 一切正常 代码运行完美 But 麻烦就在这里 如果我使用信号与一些enum class我有参数undefinedqml 信号
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • 内容居中的流式布局

    我有一排项目 当窗口宽度变得太小而无法显示一行中的所有项目时 这些项目应该堆叠起来 如下图所示 The Flow组件堆叠项目 但它们不是居中而是在左侧或右侧对齐 Flow Item Item Item Item Item QML 中是否有内
  • 将文本添加到 ggplot 中的轴标签

    我从下表中绘制了一个图表 BoatPhs fit se lower upper 1 Before 3 685875 0 3287521 3 038621 4 333130 2 After0 20NTA 3 317189 0 6254079
  • 无法将 QList 分配给 QString

    我遇到这个错误 Unable to assign QList
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui

随机推荐