QMLの第一歩

QMLドキュメントの作成

QML文書は、読みやすく構造化されたレイアウトでオブジェクトの階層構造を定義します。すべてのQML文書は、importセクションとオブジェクト宣言セクションの2つの部分から構成されています。ユーザーインターフェースで最も一般的な型や機能は、QtQuick のインポートで提供されます。

QtQuick モジュールのインポートと使用

Qt Quickモジュールを使用するためには、QML ドキュメントにQtQuick モジュールをインポートする必要があります。インポートの構文は次のようになります:

import QtQuick

Qt Quickが提供する型や機能は、QML ドキュメントで使用することができます!

オブジェクト階層の定義

QML ドキュメントのオブジェクト宣言は、ビジュアルシーンに何が表示されるかを定義します。Qt Quickは、画像やテキストを表示するためのオブジェクトや、ユーザー入力を処理するためのオブジェクトなど、すべてのユーザーインターフェースの基本的な構成要素を提供します。

単純なオブジェクトの宣言は、色のついた矩形と、その中央に配置されたテキストのようなものです:

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }
}

これは、子オブジェクトText を持つルートRectangle オブジェクトを持つオブジェクト階層を定義します。Text オブジェクトのparent は自動的にRectangle に設定され、同様にText オブジェクトは QML によってRectangle オブジェクトのchildren プロパティに追加されます。

すべてをまとめる

上の例で使われているRectangleText の型はどちらもQtQuick のインポートによって提供されています。importとオブジェクト宣言をまとめると、完全なQML文書ができあがります:

import QtQuick

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }
}

この文書を "HelloWorld.qml "として保存すれば、それを読み込んで表示することができます。

QMLプロジェクトの作成と実行

QMLドキュメントで定義されたグラフィカルシーンを表示するために、Qt Creatorでロードすることができます。このような単純な UI ファイルの場合、Qt Creator 内からFile > New File または Project > Application (Qt Quick) > Qt Quick Application - Emptyを選択します。

緑色の実行ボタンを押すとアプリケーションが実行されます。赤い四角形の中央に「Hello, World!

Qt Creator でのプロジェクトの作成と実行の詳細については、以下のページを参照してください:

コントロールを使った QML アプリケーションの作成

Qt Quick は基本的なグラフィカルエレメントを提供しますが、Qt Quick Controlsはアプリケーション内で使用するための既製の QML タイプを提供します。

ApplicationWindow タイプを挿入することは、アプリケーションを作成するための良い出発点となります。アプリケーションのUIは、このような基本的なレイアウトになっています:

各領域に異なるコントロールを追加し、接続することで、アプリケーションを構成することができます。例えば、次のスニペットは、利用可能なスペースの使い方を示す基本的なアプリケーションです:

//import related modules
import QtQuick
import QtQuick.Controls

//window containing the application
ApplicationWindow {

    visible: true

    //title of the application
    title: qsTr("Hello World")
    width: 640
    height: 480

    //menu containing two menu items
    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("&Open")
                onTriggered: console.log("Open action triggered");
            }
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    //Content Area

    //a button in the middle of the content area
    Button {
        text: qsTr("Hello World")
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
}

このアプリケーションには、2つのメニュー項目と真ん中にボタンがあります。Exit 、アプリケーションを閉じます。

また、異なるナビゲーション方法や、ボタンやスライダーなどの異なるコントロールもあります。以下のサンプルは Qt Creator から入手可能で、さまざまなコントロールとレイアウトを示します。

このシンプルな Hello World アプリケーションにスニペットをコピー&ペーストして、QML がどのように動作するかを見てください。

ユーザー入力の処理

QMLを使ってユーザーインターフェースを定義することの大きな利点の1つは、ユーザーインターフェースデザイナーが、簡単なJavaScriptの式を使って、アプリケーションがイベントにどのように反応すべきかを定義できることです。QMLではこれらのイベントをシグナルと呼び、シグナルはシグナルハンドラによって処理されます。

例えば、次のような例を考えてみましょう:

import QtQuick

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }

    TapHandler {
        onTapped: parent.color = "blue"
    }
}

この例は "ClickableHelloWorld.qml "として保存し、QMLランタイムツール qml で実行することができます。ユーザーがウィンドウのどこかをクリックすると、矩形が赤から青に変わります。

注: TapHandler はタッチイベント用にタップされたシグナルも出力しますので、このコードはモバイルデバイスでも動作します。

キーボードのユーザー入力も同様に、簡単な式で処理できます:

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }

    focus: true
    Keys.onPressed: {
        if (event.key == Qt.Key_Return) {
            color = "blue";
            event.accepted = true;
        }
    }
}

フォーカスを受け付けることで、リターンキーを押すたびに色を青に変えることができる。

プロパティのバインディング

オブジェクトとそのプロパティは、QML文書で定義されるグラフィカル・インターフェースの基礎となります。QML言語では、プロパティ同士を様々な方法でバインドすることができ、非常に動的なユーザインタフェースを実現することができます。

次の例では、それぞれの子オブジェクトRectangle のジオメトリは、親オブジェクトRectangle のジオメトリにバインドされています。親Rectangle のジオメトリが変更された場合、各子Rectangle のジオメトリはプロパティのバインディングにより自動的に更新されます。

Rectangle {
    width: 400
    height: 200

    Rectangle {
        width: parent.width / 2
        height: parent.height
        color: "blue"
    }

    Rectangle {
        width: parent.width / 2
        height: parent.height
        x: parent.width / 2
        color: "green"
    }
}

アニメーション

プロパティはアニメーションによって動的に更新することもできます。QtQuick インポートには、プロパティの値の変更をアニメーション化するために使用できる、さまざまなアニメーションタイプが用意されています。次の例では、プロパティがアニメーション化され、Text 領域に表示されます:

Rectangle {
    color: "lightgray"
    width: 200
    height: 200

    property int animatedValue: 0
    SequentialAnimation on animatedValue {
        loops: Animation.Infinite
        PropertyAnimation { to: 150; duration: 1000 }
        PropertyAnimation { to: 0; duration: 1000 }
    }

    Text {
        anchors.centerIn: parent
        text: parent.animatedValue
    }
}

表示される値は0から150まで周期的に変化します。

再利用のためのカスタム QML タイプの定義

QMLの最も重要な概念のひとつに、型の再利用があります。QMLでは、このようなものを再利用可能なカスタム型として定義することで、コードの重複を最小化し、可読性を最大化することができます。

例えば、開発者がMessageLabel.qml ファイルで新しいMessageLabel 型を定義したとします:

// MessageLabel.qml
import QtQuick

Rectangle {
    height: 50
    property string message: "debug message"
    property var msgType: ["debug", "warning" , "critical"]
    color: "black"

    Column {
        anchors.fill: parent
        padding: 5.0
        spacing: 2
        Text {
            text: msgType.toString().toUpperCase() + ":"
            font.bold: msgType == "critical"
            font.family: "Terminal Regular"
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            ColorAnimation on color {
                running: msgType == "critical"
                from: "red"
                to: "black"
                duration: 1000
                loops: msgType == "critical" ? Animation.Infinite : 1
            }
        }
        Text {
            text: message
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            font.family: "Terminal Regular"
        }
    }

}

その型は、次のようにアプリケーション内で複数回再利用することができます:

// application.qml
import QtQuick

Column {
    width: 180
    height: 180
    padding: 1.5
    topPadding: 10.0
    bottomPadding: 10.0
    spacing: 5

    MessageLabel{
        width: parent.width - 2
        msgType: "debug"
    }
    MessageLabel {
        width: parent.width - 2
        message: "This is a warning!"
        msgType: "warning"
    }
    MessageLabel {
        width: parent.width - 2
        message: "A critical warning!"
        msgType: "critical"
    }
}

このようにして、モジュール化されたユーザーインターフェースの型は、アプリケーション内で組み立てられ、再利用されます。

再利用可能なコンポーネントを開発する方法の詳細については、QMLオブジェクト属性を参照してください。

これからの展開

QMLが実際に使われているのを見たところで、次のステップに進みましょう。次のページでは、QMLを使ったあなたの旅を紹介します。

©2024 The Qt Company Ltd. ここに含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。