2014-08-27 9 views
7

Ich versuche, ein Formular zu aktualisieren ein WebView in QML, aber ich habe Probleme mit der Aktualisierung der Ansicht und Text mit GoLang.Qt GUI Update-Elemente nicht mit Golang

Ich habe ähnliche Beiträge wie this one und this one angesehen, aber es ist immer noch nicht klar.

Wie Sie unten sehen können, versuche ich die WebView zu aktualisieren, um die angezeigte Seite und das Textelement zu ändern, so dass ich um meiner selbst willen sehen kann, was gespeichert wird, wenn ich den Knopf drücke. Die GUI ändert sich jedoch nicht.

Was ich bisher habe, ist dies:

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 
} 

und die QML-Datei:

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 
     } 

    } 

} 

Antwort

1

Dieses Beispiel sollte das Textelement ändern, und manipulieren die Webansicht neue Seite zu laden basierend auf der Benutzereingabe:

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")) 
} 

Damit dies funktioniert, haben Sie die ObjektName Eigenschaft für die festlegen webview Komponente:

WebView 
{ 
    objectName: "tralalala" 
    id: frame 
    url: ctrl.message 
    width: 640 
    height: 300 
    smooth: false 
} 

Falls Ihre Absicht, den Inhalt der Webansicht (zum Ausfüllen des Suchformulars) zu manipulieren war, das ist nicht möglich, wenn die public api verwenden. Sie können die URL jedoch immer so manipulieren, dass sie Ihre Suchbegriffe enthält.