QML - 在重叠的 Text 和 TextArea 之间动态交换可见性/不透明度

Posted

技术标签:

【中文标题】QML - 在重叠的 Text 和 TextArea 之间动态交换可见性/不透明度【英文标题】:QML - Dynamically swap the visibility/opacity between overlapping Text and TextArea 【发布时间】:2015-01-21 04:19:43 【问题描述】:

我想在 QML 中有一个小部件,它具有以下行为的组合:

1) 多行编辑 2)当我点击换行符时自动滚动内容。 (当我在底部输入新内容时,页面顶部的内容会不断上升) 3) 具有占位符文本功能。

据我所知,只有 Text 和 TextField 具有占位符文本属性,并且只有 TextArea 具有多行编辑和自动滚动功能。但是,如果有任何这样的小部件具有所有组合,那么我的问题“在重叠的 Text 和 TextArea 之间动态交换可见性/不透明度”将是无效的。

如果没有这样的小部件(我想知道为什么),我想有一个矩形,它同时具有 Text 和 TextArea 重叠,并且基于以下逻辑,我希望将可见性/不透明度/焦点放在其中一个上:

如果文本区域为空(0 个字符),则使前景中的文本具有焦点并使用占位符文本“输入一些文本”。但是一旦用户开始输入,文本应该失去焦点、不透明度并进入背景,而 TextArea 应该获得焦点并进入前台并开始接受多行输入。同样,当 TextArea 位于前台且为空(0 个字符)并且当用户单击我的 Rectangle 之外的任何其他小部件时,Text 应该再次获得焦点,来到前台并再次显示占位符。

我试图从这个code 中获得灵感,但惨遭失败,如果有人能帮我写几行代码或给我一些关于如何解决这个问题的建议,那将会很有帮助。

【问题讨论】:

【参考方案1】:

您可以为TextArea 实现placeholderText,就像Qt 在TextField 中所做的那样。来源可以在这里找到:TextField.qml

当您删除所有 cmets 和属性时,您基本上有一个背景,在此基础上还有一个 MouseArea、placeholderText Text 和一个 TextInput。由于您需要在 TextArea 下方直观地显示占位符,因此您必须具有透明背景:

PlaceholderTextArea.qml

import QtQuick 2.3
import QtQuick.Controls 1.2

Rectangle 
    property alias placeholderText: placeholder.text

    id: background
    width: 640
    height: 480
    color: "#c0c0c0"

    Text 
        id: placeholder
        anchors.fill: parent
        renderType: Text.NativeRendering
        opacity: !textArea.text.length && !textArea.activeFocus ? 1 : 0
    

    TextArea 
        id: textArea
        anchors.fill: parent
        backgroundVisible: false
    

并使用您的组件:

PlaceholderTextArea 
    placeholderText: qsTr("Hello World")
    anchors.fill: parent

【讨论】:

这非常接近我想要的,但缺少我的要求之一。如您所见,当我开始输入时占位符消失了,但我希望占位符在我单击小部件的那一刻消失(有输入的动机)。以下顺序是我所期待的。单击后,占位符应该消失并且光标应该闪烁以允许我输入只要焦点在 textarea 上,但是如果我访问另一个页面或另一个选项卡,甚至单击任何其他小部件并且当我重新访问时textarea 如果文本区域仍然是空的,占位符应该重新出现。【参考方案2】:

这是一个替代实现,对我来说效果更好:

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4

Item

    property alias placeholderText: placeholder.text

    property bool __shouldShowPlaceholderText:
        !textArea.text.length && !textArea.activeFocus

    // This only exists to get at the default TextFieldStyle.placeholderTextColor
    // ...maybe there is a better way?
    TextField
    
        visible: false
        style: TextFieldStyle
        
            Component.onCompleted: placeholder.textColor = placeholderTextColor
        
    

    TextArea
    
        id: placeholder
        anchors.fill: parent
        visible: __shouldShowPlaceholderText
        activeFocusOnTab: false
    

    TextArea
    
        id: textArea
        anchors.fill: parent
        backgroundVisible: !__shouldShowPlaceholderText
    

【讨论】:

以上是关于QML - 在重叠的 Text 和 TextArea 之间动态交换可见性/不透明度的主要内容,如果未能解决你的问题,请参考以下文章

转载 qml: MouseArea重叠问题;

QML 中的 Flickable / ScrollView 带有始终可见的滚动条,在右下角不重叠

QT 5.7 QML 快速半透明矩形,一侧有圆角

为啥 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配

在 QML 中使用 Text.implicitWidth 时的性能损失

如何在QT QML中替换变体数组文本