QML(Qt)でデスクトップで動いてるかモバイルで動いてるかを判断する

Rewit for Qtをちゃんとモバイル端末(よーするにSymbianとかMeeGo)で動くにしよう!
と、思い立ってQtシミュレータで動かしたらレイアウトがひどい事になってて調整機能を実装したのはいいけどデスクトップとモバイルの自動切り替えが・・・となったのでうだうだしてたら「天のお告げ」が@task_jpさんよりいつもの如く舞い降りてきたのでちびっとだけカスタマイズして見ました。


/// 今日のポイント ///
・「Qt::createQmlObject」を使って特定の環境でしかインポートできないモジュールをロードする
・エレメントに「func()」を用意して追加情報を拾えるようした
・Symbian専用のエレメントとかコードを文字列にしているので他の環境でエラーにならない


今回は、「Components and Addons for Qt」の「Qt Quick Components for Symbian 1.0」を利用します。
(1.1もドキュメントはあるけどQtシミュレータでは動きませんでした。設定が悪いのかな?)
これで「Qt::createQmlObject」が例外を吐かなければ、モバイルですね!って判断ができます。
あわよくば、追加情報を取ることができるのでサンプルだと「Screen.dpi」を取得しようとしてます。
Qtシミュレータだとundefinedなんですけど実機だと動くのでしょうか?

サンプルでは「Window」エレメントを使っているのですが、本当は「Item」を使おうとしてダメだったので変更しました。WindowエレメントはItemエレメント継承してるのにねー。


/// 注意 ///
開発環境が入っていると「com.nokia.symbian 1.0」がインポートできてしまうのでテストになりません。
なのでデスクトップ側の動作を試す場合は、開発環境のないところで動かしてください。
もしくはdllがロードされないようにしてください。


/// サンプル ///
import QtQuick 1.0

Rectangle {
    id: _root
    width: 360
    height: 360
    color: "#0000dd"
    Text {
        text: isMobile ? ("running on mobile! " + dpiMobile) : qsTr("Hello World")
        anchors.centerIn: parent
    }

    // テスト用プロパティ
    property bool isMobile: false
    property real dpiMobile: 0.0

    // モジュールのロードチェックと情報取得
    function check(module, version, element, statement, parent) {
        var ret = false;
        try{
            var obj = Qt.createQmlObject("import " + module + " " + version + "; "
                                         + element + "{function func(){"
                                         + statement + "}}"
                                         , parent);
            obj.func();
            obj.destroy();
            ret = true;
        }catch(e){
            console.debug("device info:exception:" + e);
        }
        return ret;
    }

    Component.onCompleted: {
        // デバイスチェック
        if(check("com.nokia.symbian", "1.0"
                 , "Window"
                 , "if(Screen.dpi !== undefined){parent.dpiMobile = Screen.dpi;}"
                 , _root)){
            // mobile(symbian)
            isMobile = true;
        }else{
            // desktop
        }
    }

}