2014-08-27 50 views
7

QML'de bir form güncellemesi WebView yapmayı denedim ancak görüntü ve metni GoLang kullanarak güncellerken sorun yaşıyorum.qt gui güncelleme öğeleri Golang ile çalışmadı

this one ve this one gibi benzer iletilere baktım, ancak yine de net değil.

Aşağıda gördüğünüz gibi, gösterilen sayfayı değiştirmek için WebView'u güncellemeye çalışıyorum ve Text öğesine basın, böylece düğmeye bastığımda ne saklanmakta olduğumu kendim görebilirim. Ancak GUI değişmez. Şimdiye kadar var ne

şudur:

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 
} 

ve QML dosyası:

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 
     } 

    } 

} 

cevap

1

yeni sayfa yüklemeye web görüntülemesini metin öğesi değiştirmek ve manipüle gerekir Bu örnek tabanlı kullanıcı girdisi:

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

Bunun çalışması için, bunun için objectName özelliğini ayarlamanız gerekir. Webview bileşen: niyetiniz (arama formunu doldurarak için) Web görünümündeki içeriğini işlemek için olan durumda

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

, o public api kullanarak mümkün değildir. Ancak, arama terimlerinizi içerecek şekilde her zaman URL'yi değiştirebilirsiniz.