使用go-qml从QML获取用户输入

时间:2014-09-07 07:10:37

标签: go qml

我尝试使用gopkg.in/qml.v1包从qml获取用户输入。 从Go设置值是成功的。但我无法取回改变的价值观。 例如,我将 Name 从go代码设置为qml。在用户更改文本字段并按按钮后,我读取用户输入并推回"Hello, " + ctrl.Name

这是一个例子:

main.go

package main

import (
    "fmt"
    "gopkg.in/qml.v1"
    "os"
)

func main() {
    if err := qml.Run(run); err != nil {
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(1)
    }
}

func run() error {
    engine := qml.NewEngine()

    component, err := engine.LoadFile("main.qml")
    if err != nil {
        return err
    }

    context := engine.Context()
    context.SetVar("ctrl", &Control{Name: "Enter your name"})

    window := component.CreateWindow(nil)

    window.Show()
    window.Wait()

    return nil
}

type Control struct {
    Name    string
    Message string
}

func (ctrl *Control) Hello() {
    go func() {
        ctrl.Message = "Hello, " + ctrl.Name
        qml.Changed(ctrl, &ctrl.Message)
    }()
}

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.1

Rectangle {
    id: root
    color: "#ffffff"

    width: 320
    height: 320

    TextEdit {
        id: textEdit1
        x: 8
        y: 8
        width: 304
        height: 20
        text: ctrl.name
        font.pixelSize: 12
    }

    Button {
        id: button1
        x: 8
        y: 34
        width: 304
        height: 27
        text: qsTr("Button")
        onClicked: {
            ctrl.hello()
        }
    }

    Text {
        id: text1
        x: 8
        y: 67
        width: 304
        height: 23
        text: ctrl.message
        font.pixelSize: 12
    }
}

为了使这项工作,我必须在 Button onClicked()中添加显式赋值,如下所示:

Button {
    id: button1
    x: 8
    y: 34
    width: 304
    height: 27
    text: qsTr("Button")
    onClicked: {
        ctrl.name = textEdit1.text
        ctrl.hello()
    }
}

我做错了什么?谢谢

1 个答案:

答案 0 :(得分:4)

您必须使用绑定来更新ctrl.name,否则它将保持不变:

TextEdit {
    id: textEdit1
    x: 8
    y: 8
    width: 304
    height: 20
    text: ctrl.name
    font.pixelSize: 12
}
Binding { target: ctrl; property: "name"; value: textEdit1.text }

参考:http://qt-project.org/doc/qt-5/qml-qtqml-binding.html