Ubuntu Weekly Recipe

第351回 GoとQMLとGUIアプリ

この記事を読むのに必要な時間:およそ 5.5 分

Goの型をQMLで利用する

qml.RegisterTypes()を利用するとGoの型をQMLの中で利用できます。前述のサンプルのwebviewの部分を次のコードで置き換えてください。

const webview = `
import QtQuick 2.0
import QtWebKit 3.0
import Matcher 1.0

WebView {
    width: 1024
    height: 768

    Matcher {
        id: matcher
        objectName: "matcher"
        text: ""
    }

    onLinkHovered: {
        matcher.check(hoverUrl)
    }
}
`

type Matcher struct {
    Text string
}

func (m *Matcher) Check(url string) {
    if len(m.text) > 0 && strings.Contains(url, m.Text) {
        fmt.Println(url)
    }
}

さらにrun()を次のように変更します。

func run() error {
    qml.RegisterTypes("Matcher", 1, 0, []qml.TypeSpec{{
        Init: func(m *Matcher, obj qml.Object) {},
    }})
    engine := qml.NewEngine()
    (中略)
    root.Set("url", os.Args[1])
    matcher := root.ObjectByName("matcher")
    matcher.Set("text", "ubuntu")
    win.Show()
    (後略)

また,import文にstringsパッケージも追加しておきます。

この状態でwebview.goをビルドして実行すると,⁠ubuntu」が含まれるリンクにマウスカーソルを合わせたときに,端末にそのURLが表示されるようになります。

Goで作成した型をQML側に表示させるにはqml.RegisterTypes()を使います。最初の3つの引数はQMLでインポートするときのモジュール名とメジャー番号,マイナー番号です。4つ目の引数に公開したいGoの型のQMLでインポートされる際の初期化関数をそれぞれ記述していきます。今回はMatcher型を公開したいものの,初期化コードは不要なため空の関数を登録しています。

webview変数で指定しているQMLの中ではMatcherタイプとして登録されたGoの構造体やメンバーにアクセスできます。このときメンバー名やメソッドの最初の文字は小文字になることに注意してください注4⁠。run()関数の後半では,このMatcherオブジェクトをObjectByName()で取得し,そのtextプロパティを「ubuntu」に変更しています。

注4)
変更ルールについては,qo-qmlのドキュメントの「Lowercasing of names」を参照してください。

さらにMatcher構造体にはCheck()というメソッドを定義しています。これは渡された文字列の中に,Matcher.Textで指定した文字が存在するかどうかをチェックし,存在するなら標準出力にそのURLを出力しています。QML側からもこのメソッドにはアクセス可能で,onLinkHoveredシグナルハンドラの中でhoverdUrlをCheck()に渡しているので,リンクにマウスカーソルを合わせる度にURLを確認できるのです。

公式のサンプル集

go-qmlのコードは「go get」実行時に「$GOPATH/src/gopkg.in/qml.v1/」以下に展開されています。前述したように,ここのexampleフォルダーにはいくつかのサンプルコードがありますので,適当な場所にコピーしてそれぞれビルドして動作を試してみると良いでしょう。

図2 gopherサンプルでは,OpenGLを用いてGopherの3Dモデルを表示できる

図2 gopherサンプルでは,OpenGLを用いてGopherの3Dモデルを表示できる

その他の情報

Ubuntu SDKもgo-qmlを使ったアプリケーションの開発に対応しています。Ubuntu SDKを使えば,Ubuntu Touch用のClickパッケージとして作成できるうえに,schrootを使ったクロスアーキテクチャなビルドにも対応しています。

QMLはQt Creatorを使って編集するといろいろ便利ですが,Goのほうは普段使っているエディターのほうが良いかもしれません。たとえばVimならvim-go-extraと言ったプラグインが用意されているようです。ちなみにシンタックスハイライトだけで良いのであれば,以下のようにUbuntuのパッケージを使うという手もあります。

$ sudo apt install vim-syntax-go
$ vim-addon-manager install go-syntax

QMLファイルを別ファイルにする場合,Goでビルドしたバイナリとは別にQMLファイルもセットで配布する必要があります。UIファイルがテキストファイルのままだと,いろいろとデバッグ用途には便利な反面,配布時に一手間増えてしまいます。そこでQMLファイルをqrcにしてGoのバイナリに取り込んでしまう方法を,go-qmlの開発者のブログで紹介しています。同じブログにはgo-qmlを使ったアプリケーション開発コンテストの結果もありますので,サンプルの1つとして参考になるでしょう。

GoではなくRubyを使いたい場合はruby-qmlというものが存在するようです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。