QML 动态添加标签

Sor*_*our 1 qt qml

好吧,我正在尝试使用 qml 制作一种信使。我有一个文本区域和一个发送按钮。单击发送按钮时,文本区域内的文本将显示在屏幕上的某处。但文本区域中的任何其他更改都会更改标签的上下文。我尝试使用 createObject(...) 但没有帮助。还有其他方法可以动态创建标签(或任何其他组件)吗?

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.1
ApplicationWindow {

    visible: true
    width: 640
    height: 480
    property var xPosition : 500
    property var yPosition: 200
    title: qsTr("server")
    Rectangle{
        width: parent.width
        height: parent.height

        Button{
            id: sentButton
            width: parent.width / 14
            x: parent.height + 112
            y: parent.width - 200
            Material.accent: Material.Blue
            Material.background: Material.DeepOrange
            Text {
                id: name
                text: qsTr("Send")
                color: "white"
                x:parent.width / 4
                y:parent.height / 4
            }
            onClicked: {
                //add label with the context of textarea


            }
        }

        Rectangle{
            id:back
            height: sentButton.height
            width: parent.width - sentButton.width
            x:0
            y: 435
            color: "white"
            border.width: 0.5

            TextArea{
                id:search
                placeholderText: qsTr("Search")
                x:7
                width: parent.width - 25
                background: null
            }

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Gre*_*cKo 5

我不会手动创建Label,而是向模型添加一行(如ListModel)并用ListView.

将为ListView模型的每一行实例化一个委托,它比手动执行更干净。另外,您还可以免费获得滚动行为。

这里的例子:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.1

ApplicationWindow {

    visible: true
    width: 640
    height: 480
    Material.accent: Material.DeepOrange

    ListModel {
        id: messageModel
    }

    ColumnLayout {
        anchors { fill: parent; margins: 8 }
        spacing: 16
        ListView {
            Layout.fillWidth: true; Layout.fillHeight: true
            model: messageModel
            delegate: ItemDelegate { text: model.message }
        }
        RowLayout {
            spacing: 16
            Layout.fillWidth: true; Layout.fillHeight: false
            TextField {
                id: textField
                Layout.fillWidth: true; Layout.fillHeight: true
            }
            Button {
                Material.foreground: "white"; Material.background: Material.DeepOrange
                Layout.fillHeight: true
                text: "Send"
                onClicked: {
                    messageModel.append({message: textField.text});
                    textField.text = "";
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,Button将向 附加一个新行,并将ListModel的作为消息角色TextFieldtext然后,ListView模型的每一行都会实例化一个ItemDelegate显示消息的角色。