分かってしまえば簡単だけど、まるまる一週間はまってしまったのでメモ(訂正あり)。
go言語にgo-qmlとQt5でWebView画面を持つGUIを作り、さらに自分自身をmartiniでWebサーバーにして自分自身をリッスンさせようとしていた。
条件:
- Mac OS X Yosemite
- Qt: 5.5
- Go: 1.4.2
- martiniとgo-qmlを
go get
でインストール
qml、テンプレート、メインのgoを以下のような感じで書いた。
import QtQuick 2.4
import QtQuick.Window 2.2
import QtWebKit 3.0
Window {
property int win_width: 1280
property int win_height: 800
visible: true
width: win_width
height: win_height
WebView {
id: resultwebview
anchors.fill: parent
url: "http://localhost:3000/"
}
}
<h2>Hello {{.}}!</h2>
package main
import (
"fmt"
"os"
"github.com/go-martini/martini"
"github.com/martini-contrib/render"
"gopkg.in/qml.v1"
)
const (
QMLPATH = "qml/main.qml"
)
func main() {
m := martini.Classic()
// render html templates from templates directory
m.Use(render.Renderer())
m.Get("/", func(r render.Render) {
r.HTML(200, "hello", "jeremy")
})
go m.Run()
if err := qml.Run(run); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
// Runs QML GUI.
func run() error {
engine := qml.NewEngine()
controls, err := engine.LoadFile(QMLPATH)
if err != nil {
return err
}
// Shows default messages.
window := controls.CreateWindow(nil)
window.Show()
window.Wait()
return nil
}
go run main.go
すると、一応期待どおりに動いたものの、Web-Starter-Toolkitを入れてから挙動がおかしくなった。一度表示したWeb-Starter-Toolkitのデモ画面とCSSが固定されてしまい、cssやhtmlを試しに削除してもデモ画面がずっと表示され続けてしまう。
明らかに存在しないはずのhtmlやcssが取得される様子は、ちょっとしたホラーだった。どこのキャッシュだかゴミ捨て場だかを参照していたのかは結局わからず。
数日かけてQtからmartiniまでひたすら調べたところ、Web-Starter-Toolkitのせいではなく、QMLのurl: "http://localhost:3000"
でおかしなところからWeb画面を取得しているっぽかった。
もしやと思ってこの箇所をurl: "http://127.0.0.1:3000"
に変えると、あっさり正常に復帰した。理由は不明だけど、ここにはlocalhost
を指定すべきではないらしい。もともとそんな利用法は想定していないと思うので仕方ないとは思うけど。
こんなことに一週間もかかるとは...いずれにしろ、これでやっとWeb-Starter-Toolkitを本格的に楽しめそう。
訂正
その後しばらくしてまた同じ現象が起きた。結局、URLを変えるとその場は解消することがわかった。アドレスやポートのどこかを変えればよいが、ポートを変えるのが楽。
おそらく、レンダリングエンジン(たぶんChromeのやつ)でCSSキャッシュがなにかのはずみで更新されなくなるのだろう。Railsのアセットパイプラインみたいにcssファイル名にハッシュを含められるかどうか調べてみるつもり。