Pat*_*ick 7 user-interface qt signals go qml
我正在尝试使用WebViewQML 进行表单更新,但是我在使用GoLang更新视图和文本时遇到问题.
正如您在下面看到的,我正在尝试更新WebView以更改显示的页面和Text元素,以便我可以看到当我按下按钮时存储的内容.但是GUI不会改变.
到目前为止我得到的是:
package main
import (
"time"
"math/rand"
"fmt"
"os"
"gopkg.in/qml.v1"
)
type Control struct {
Root qml.Object
Message string
}
func (ctrl *Control) Savetf1contents(text qml.Object) {
fmt.Println("in Savetf1contents():")
fmt.Println("text:", text.String("text"))
}
func (ctrl *Control) Loadtf1contents(text qml.Object) {
fmt.Println("in Loadtf1contents():")
fmt.Println("text:", text.String("text"))
go func() {
ctrl.Message = "loaded from tf1..."
qml.Changed(ctrl, &ctrl.Message)
}()
}
func main() {
if err := qml.Run(run); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func run() error {
// qml.RegisterTypes("GoExtensions", 1, 0, []qml.TypeSpec{{
// Init: func(r *GoRect, obj qml.Object) { r.Object = obj },
// }})
engine := qml.NewEngine()
component, err := engine.LoadFile("helloworld.qml")
if err != nil {
return err
}
ctrl := Control{Message: "http://google.co.uk"}
context := engine.Context()
context.SetVar("ctrl", &ctrl)
window := component.CreateWindow(nil)
ctrl.Root = window.Root()
rand.Seed(time.Now().Unix())
window.Show()
window.Wait()
return nil
}
Run Code Online (Sandbox Code Playgroud)
和QML文件:
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
import QtWebKit 3.0
ApplicationWindow {
//property alias form: ctrl.message
title: qsTr("Dashboard")
width: 640
height: 480
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
Grid {
columns: 3
spacing: 2
Text {
width: 335
// text: qsTr("Dashboard")
text: qsTr(ctrl.message)
}
Rectangle{
width: 200
height: 30
radius: 3
color: "#fff"
TextInput {
id: form
anchors.left: parent.right
anchors.top: parent.top
anchors.leftMargin: -195
anchors.topMargin: 5
text: qsTr("")
focus: true
width: 200
}
}
Button {
text: qsTr("Search User")
onClicked: {
ctrl.savetf1contents(form)
}
}
}
Grid {
columns: 1
spacing: 2
anchors.top: parent.top
anchors.topMargin: 35
id: text
WebView {
id: frame
url: ctrl.message
width: 640
height: 300
smooth: false
}
}
}
Run Code Online (Sandbox Code Playgroud)
此示例应更改文本元素,并操作 webview 以根据用户输入加载新页面:
func (ctrl *Control) Savetf1contents(text qml.Object)
{
fmt.Println("in Savetf1contents():")
fmt.Println("text:", text.String("text"))
// Change the message & update
ctrl.Message = text.String("text")
qml.Changed(ctrl, &ctrl.Message)
// Find the webview element
webframe := ctrl.Root.ObjectByName("tralalala")
// Load new page!
webframe.Set("url", text.String("text"))
}
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您必须设置 webview 组件的 objectName 属性:
WebView
{
objectName: "tralalala"
id: frame
url: ctrl.message
width: 640
height: 300
smooth: false
}
Run Code Online (Sandbox Code Playgroud)
如果您的目的是操纵 webview 的内容(用于填写搜索表单),则使用public api是不可能的。但是,您始终可以操纵 url 以包含您的搜索词。