2014-08-27 24 views
7

我試圖在QML中進行表格更新WebView,但是我遇到了使用GoLang更新視圖和文本的問題。qt gui更新元素不與Golang一起使用

我看過類似的帖子,如this onethis one,但它仍然不清楚。

正如您在下面看到的,我試圖更新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 
} 

和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 
     } 

    } 

} 

回答

1

這個例子應該改變的文本元素,並操縱的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")) 
} 

爲了這個工作,你必須設置objectName屬性爲網頁視圖組件:

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

如果你的意圖是要操縱的WebView的(用於填寫搜索表單)的內容,通過使用public api是不可能的。但是,您始終可以操縱網址來包含您的搜索字詞。