我尝试使用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()
}
}
我做错了什么?谢谢
答案 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 }