今年も Advent Calendar の季節になりました。今年も色々な人による Qt の色々な記事を楽しみにしています。

昨日は @hermit4 さんによる Qtのマルチスレッド機構 という記事でした。
個人的にはがっつりスレッドを使ったら負けだと思っていますが、そうは言っても使わざるを得ないことも多々あるわけで、こういう風に具体的な使い方や使い分けがまとまっていると非常にありがたいですね。

今日は趣味で開発をしている QtWebService というプロジェクトの紹介をしたいと思います。

QtWebService とは?

QtWebService とは、QML という言語でアプリケーションを記述し実行するためのウェブサーバーです。
2012年頃から silk という名前で開発をしていましたが、いつのころから改名をしました。

特徴1:QML で様々なコンテンツの生成が可能

QML という言語は「エレメント」と呼ばれる様々な部品をツリー構造で記述し、それぞれのエレメントに対して「プロパティ」と呼ばれるパラメータを指定することが可能です。
QML のエレメントは QObject のサブクラスとして自由に作成でき、QML のプロパティは Qt が C++ を独自拡張して提供している QObject のプロパティ として自由に作成することができるようになっています。
この柔軟な言語と拡張性を最大限に活用し、QtWebService では様々なコンテンツを QML という一つの言語で記述できるようにしました。

QML で HTML を記述する

index.qml
import QtWebService.HTML 5.0

Html {
    Head { ... }
    Body {
        H1 { text: 'title' }
        P { text: '...' }
    }
}

生の HTML で記載するよりも何となく見やすいですね?

QML で CSS を記述する

css.qml
import QtWebService.CSS 3.0

Css {
    Rule {
        selector: 'body'
        background_color: '0'
    }
    ...
}

QML は CSS にとても似ているので混乱しますね?

QML で JSON を記述する

api.qml
import QtWebService.JSON 1.0

Json {
    object: {
        'key': 'width'
        , 'value': 100
    }
}

QML って JSON に似てますね?

その他様々なフォーマットに対応しています

単に文字列を返すことも可能ですし、XML の API を提供する事も可能です。

特徴2:JavaScript でロジックが書ける

JavaScript でコンテンツを変化させる

fortune.qml
import QtWebService.HTML 5.0

Html {
    Head { title: 'Fortune' }
    Body {
        H1 { text: 'Fortune' }
        P {
            text: {
                var results = ['大吉', '中吉', '小吉', '吉', '末吉', '凶', '大凶']
                return results[Math.floor(results.length * Math.random())]
            }
        }
    }
}

HTTP のヘッダや入力、クッキーの対応

QtWebService の examples で様々なサンプルを提供していますが、http という名前のグローバルオブジェクトが提供する API によりフォームからの入力の取得やクッキーなど HTTP プロトコルの様々な機能を利用することができるようになっています。

QtWebService を使ってみよう

Getting Started のページにセットアップの手順が記載されています。現在 Linux でのみ動作確認をしていますが、Qt の API のみで作られているので macOS でも Windows でも Android でも iOS でも QNX でも INTEGRITY でも動くはずです。

開発者募集中

現在 QtWebService ではみなさんのお手伝いを必要としています。
開発だけではなく、公式コンテンツの充実やテストの整備、ドキュメントの充実など QtWebService に足りてないところを手伝っていただける方がいましたら、@task_jp まで是非連絡ください。

開発は主に qt-users.jp の gerrit で行っています。気軽に github のアカウントでサインインしてパッチを送ってください!

実は Qt ユーザー会のウェブサイト も QtWebService で動いています。こちらも情報が古かったり足りなかったりしているので、みなさんの力でもう少しコンテンツを充実させていけたらいいなぁと思っているので、ちょっとでも QtWebService に興味をもたれた方は、このへん を見ながら適当に git push してもらえるとうれしいなー。

というわけで、おしまいです。明日は現時点で未定です!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.