Qt 6.10 リリース

このブログは「Qt 6.10 Released!」を抄訳です。

Qt 6.10 がリリースされました。アプリケーション開発者およびデバイス開発者の皆様向けに、新機能と改善点を提供いたします。

UI 開発者向けの主な機能としては、Qt Quick 向けの新しいフレックスボックスレイアウトシステム、 SVG および Lottie 形式でのベクターアニメーションの拡充が挙げられます。また、皆様からのフィードバックを反映し、C++ コードと QML で開発された Qt Quick UI 間のデータ交換を容易にしました。このようなデータは、新しい SearchField コントロールや、Qt Graphs モジュールの新機能である FilledSurface グラフでご利用いただけます。

既存のコードベースを維持される場合でも、Qt 6.10 へのアップグレードにより、デスクトップおよびモバイルプラットフォーム双方において、アプリケーションが自動的に高コントラストのシステム設定に適合するようになります。アクセシビリティ実装におけるこの改善をはじめとする数々の改良は、支援技術に依存するユーザーに直接的な恩恵をもたらし、追加の開発作業を必要とせずにユーザビリティと包括性を向上させます。

これらの主な機能に加え、Qt モジュール全体にわたる新しい API は、QML および C++ 開発者、ならびに Qt Widgets および Qt Quick のユーザー双方にとって、柔軟性と生産性の向上をもたらします。

リリースウェビナー

Qt 6.10の主要な機能更新について、当社の専門家がご説明いたします。

 

リリース動画

ハイライトはこちらでご覧いただけます。

 

アクセシビリティの改善

ハイコントラストモードは、視覚的な明瞭さと使いやすさを向上させるため、主要なオペレーティングシステム全体で重要な機能となっております。Qt 6.10のリリースに伴い、組み込みスタイルをプラットフォーム固有のコントラスト設定に整合させました。これにより、アプリケーションの視覚的な一貫性がユーザーエクスペリエンス全体と保たれ、より幅広いユーザー層にとってアクセシビリティが向上します。加えて、様々なアクセシビリティ規制への準拠が容易になります。

How Qt Widgets adapts to changes in Contrast Theme on Windows 11

当社の各種組み込みスタイルにおけるハイコントラストモードのサポートに関する詳細はQt 6.10 ハイコントラストモードのブログ記事をご参照ください。

また、QtウィジェットおよびQuickコントロールがスクリーンリーダーなどの支援技術クライアントにどのように表示されるかについても見直しと改良を行い、基盤となるプラットフォーム(特にWebAssemblyプラットフォーム)への統合を強化いたしました。これらの変更の多くは、LTSブランチの今後のパッチリリースにも反映される予定ですので、最新状態を維持されることをお勧めいたします。

UIの構築をより簡単に

Qt Quickは進化を続け、新たな技術を取り入れることで、より迅速な開発と反復作業をサポートしております。Qt 6.10では、新たなQuick Controlにより、UIの応答性を高め、よりモダンな外観を実現し、カスタムコードを削減する新たな方法を提供します。

Flexboxレイアウト

Qtは長年にわたり、ユーザーインターフェース内のコンポーネントを自動的に配置する様々なレイアウトタイプを提供してまいりました。Qtのレイアウトは、レスポンシブでサイズ変更可能なインターフェースの作成に特に適しており、様々なプラットフォームや異なる画面サイズ・アスペクト比で動作する必要があるユーザーインターフェースを構築する際に非常に有用です。また、テキストの長さが異なる言語へ翻訳や、ユーザーが異なるフォントサイズを好む場合にも対応可能な、単一のユーザーインターフェースを構築することも可能となります。

Qt 6.10 では、FlexboxLayout という新しいレイアウトタイプが、Qt Quick の既存のレイアウトタイプに加わりました。Qt の FlexboxLayout は、CSS のフレックスボックスレイアウトでお馴染みの機能を提供すると同時に、レイアウト内の個々のアイテムの動作を設定するためのアタッチドプロパティなど、Qt Quick のレイアウトメカニズムでお馴染みの概念と緊密に統合されています。

FlexboxLayoutは現時点では技術プレビュー段階であり、実装およびAPI設計に関する皆様のご意見を心よりお待ちしております。レスポンシブなユーザーインターフェースを特に迅速かつ容易に作成できるよう設計されると同時に、実行時のパフォーマンスも維持しております。

アニメーション対応ベクターグラフィックス

過去数回のリリースにおいて、Qt QuickのシーングラフおよびQt Quick Shapesモジュールにおけるベクターグラフィックスのサポート、ならびにQtのSVG画像処理能力を着実に強化してまいりました。Qt 6.8ではVectorImage要素とsvgtoqmlツールを導入し、これらによりベクターグラフィックスコンテンツをQt Quickシーングラフへ直接取り込むことが容易になりました。

Qt 6.10では、SVG形式またはLottie形式の画像に対するアニメーション付きベクターグラフィックスのサポートを追加いたします。Lottieファイルのサポートは全般的に改善され、Qt Lottieモジュールはより広範な最新のLottieファイルに対応するようになりました。VectorImageタイプでのLottieの直接サポートにより、Lottieファイルをスケーラブルかつハードウェアアクセラレーション対応のベクターグラフィックスとしてレンダリングすることが可能となります。

 

詳細については、Qt 6.10におけるアニメーション対応ベクターグラフィックスのブログ記事をご覧ください。

新しい Quick コントロール: SearchField

新しい SearchField コントロールは、検索機能に使用するために設計された専用の入力フィールドです。すべての Qt Quick コントロールと同様に、様々な組み込みスタイルに対応して実装されており、主要なプラットフォームすべてでネイティブな見た目と操作感を提供します。

SearchField {
    id: colorSearch
    suggestionModel: colorFilter
    anchors.horizontalCenter: parent.horizontalCenter
}
SearchField in Basic style SearchField in Fusion style SearchField in FluentWinUI3 style SearchField in Material style

 

SearchFieldは、入力フィールドに入力されたテキストに基づいてフィルタリングされた、モデルからの関連データをポップアップで表示します。モデルデータは、QMLにデータを取得するための既存のメカニズムのいずれかによって提供できますが、C++で記述されたバックエンドコードとQMLで記述されたQt Quick UIコード間のデータ交換のために、いくつかの改良が加えられています。

データとUIの連携をより簡単に

C++データモデルをQMLおよびQt Quick UIに統合することは、Qtアプリケーション構築において強力でありながら時に複雑な作業でした。Qtでは、シングルトンオブジェクト、QAbstractItemModel、コンテキストプロパティ、QObjectベースのバインディングなど、バックエンドロジックとフロントエンド表示を橋渡しする複数のメカニズムを提供しています。しかしながら、完全かつ高性能な双方向統合を構築するには、かなりの量の定型コードが必要となる場合があります。

皆様からのフィードバックに基づき、このプロセスをより効率的で直感的にするべく取り組んでまいりました。以下に、C++とQMLの連携をよりスムーズに、効率的に、そして開発者にとって使いやすいものにする、最近の改善点の一部を紹介します。

QRangeModel

Qt 6.10 の新クラスの一つである QRangeModel は、軽量かつ汎用性の高い QAbstractItemModel の実装であり、C++ の範囲(例えば std::vectorstd::array、あるいは任意の反復可能なコンテナ)を、ウィジェット内のアイテムビューや QML および Qt Quick ビューに直接公開することを目的としています。データが整数のような単純な値で構成されている場合でも、Q_GADGETstd::tupleのようなより複雑な型で構成されている場合でも、QRangeModelは自動的に適切なロールを生成し、定型的なモデルコードを必要とせずに、デリゲート内でデータにアクセスできるようにします。例えば、std::vector<int>QRangeModelでラップされ、次のようにQt Widgets UIで使用することができます。


std::vector<int> values = {1, 2, 3, 4, 5};
auto model = new QRangeModel(values);
QListView *listView = new QListView;
listView->setModel(model);

ガジェットと併用する場合、QRangeModelは各プロパティを名前付きロールとして自動的に公開します。これにより、QMLデリゲートは必要なプロパティを使用してそれらにバインドできます。例えば、ラベル付き値を表すガジェットを考えてみましょう。

struct LabeledValue {
    Q_GADGET
    Q_PROPERTY(int value MEMBER value)
    Q_PROPERTY(QString label MEMBER label)

public:
    int value;
    QString label;
};

std::vector からモデルを作成することができます。その方法は以下の通りです。

std::vector<LabeledValue> data = {
    {1, "One"}, {2, "Two"}, {3, "Three"}
};
auto labeledValues = new QRangeModel(data);

またQMLでは、デリゲート内で必須のプロパティを使用することで、以下のように型安全な方法でモデルのロールにバインドできます。

ListView {
    model: modelProvider.labeledValues

    delegate: Item {
        required property int value
        required property string label

        width: ListView.view.width
        height: 40

        Text {
            anchors.centerIn: parent
            text: label + " (" + value + ")"
        }
    }
}

このパターンにより、手動でのロール処理やコンテキストプロパティが不要となり、コンパイル済みQMLとシームレスに連携します。これにより、QAbstractItemModelの定型的な実装を一切行わずに、最新のC++とQMLを容易に連携させることが可能となります。

QRangeModelの詳細については、どんな範囲にも対応する汎用モデルのブログ記事およびAPIリファレンスドキュメントをご参照ください。

delegateModelAccessでモデルに変更を書き戻す

これまで、デリゲートからモデルに書き込むには、model オブジェクトを要求して経由するか、必須プロパティではなくコンテキストプロパティを使用する必要がありました。

ListView {
    delegate: TextInput {
        required property QtObject model
        text: model.label
        onEditingFinished: model.label = text
    }
}

この方法は機能しますが、モデルデータをデリゲートに転送するために必須プロパティを使用するという推奨事項とは相性が良くありません。Qt 6.10 では、ビューの新しいdelegateModelAccessプロパティをDelegateModel.ReadWriteに設定することで、必須プロパティを介してモデルに書き込むことが可能です。

ListView {
    delegateModelAccess: DelegateModel.ReadWrite
    delegate: TextInput {
        required property string label
        text: label
        onEditingFinished: label = text
    }
}

これはQtが提供するすべてのビューである Instantiator、Repeater、ListView、GridView、TableView、TreeView、MapItemView、Repeater3D で動作します。

Synchronizerによる双方向バインディング

双方向またはマルチシンクバインディングは、これまで多くのご要望をいただいておりました。Qt 6.10 では、Synchronizer 要素が導入されました。Synchronizer を使用することで、複数のプロパティが可能な限り同じ値を保持するようにしつつ、いずれのバインディングも破綻させないようにすることが可能です。Synchronizer導入以前は、コントロールとモデル値を同期させるには、一般的にバインディングとシグナルハンドラが必要であり、これはC++で実装されたコントロールでのみ機能しておりました。

delegate: Row {
    id: delegate
    required property int value
    required property string label

    SpinBox {
        value: delegate.value

        // Extra signal, only for input
        onValueModified: delegate.value = value
    }

    Text { text: delegate.label }
}

Synchronizer を使用すれば、同期処理を行うために必要な要素は一つだけで済みます。同期対象のプロパティの数に制限はなく、ターゲットは C++ または QML で実装することが可能です。

delegate: Row {
    id: delegate
    required property int value
    required property string label

    SpinBox {
        Synchronizer on value {
            property alias source: delegate.value
        }
    }

    Text { text: delegate.label }
}

Synchronizerは現在、Tech Preview段階です。Qt.labs.synchronizerモジュール内でご利用いただけます。

QML TreeModel

Qt Quick UI でツリーデータを利用可能にするには、これまでQAbstractItemModelの実装が必要でした。QRangeModelにより、C++ から Qt Quick UI へツリーデータ構造を公開する作業が簡素化され、モデル全体をゼロから実装する必要はなくなりました。ただし、C++ でそのようなデータ構造を実装するには依然として多少の手間がかかります。多くのユースケース、小規模なデータセット、UI プロトタイピングにおいては、ツリーデータ構造を QML 内で直接宣言するだけで十分です。

Qt 6.10で導入された新しいTreeModel QML型により、Qt内でQMLドキュメントとして直接ツリーデータ構造を宣言することが容易になりました。JSONでお馴染みの配列や辞書構文、アイテムデータ用のキーと値のペアを使用できます。

import QtQuick
import QtQuick.Controls
import Qt.labs.qmlmodels

ApplicationWindow {
    visible: true
    width: 500
    height: 500

    TreeView {
        id: treeView
        anchors.fill: parent

        selectionModel: ItemSelectionModel {}

        model: TreeModel {
            id: treeModel

            TableModelColumn {
                display: "checked"
            }
            TableModelColumn {
                display: "size"
            }
            TableModelColumn {
                display: "type"
            }
            TableModelColumn {
                display: "name"
            }
            TableModelColumn {
                display: "lastModified"
            }

            rows: [{
                    checked: false,
                    size: "—",
                    type: "folder",
                    name: "Documents",
                    lastModified: "2025-07-01",
                    rows: [{
                            checked: true,
                            size: "24 KB",
                            type: "file",
                            name: "Resume.pdf",
                            lastModified: "2025-06-20",
                        }, {
                            checked: false,
                            size: "2 MB",
                            type: "folder",
                            name: "Reports",
                            lastModified: "2025-06-10",
                            rows: [{
                                    checked: true,
                                    size: "850 KB",
                                    type: "file",
                                    name: "Q2_Report.docx",
                                    lastModified: "2025-06-15",
                                }, {
                                    checked: false,
                                    size: "1.2 MB",
                                    type: "file",
                                    name: "Q3_Plan.xlsx",
                                    lastModified: "2025-06-18",
                                }]
                        }]
                },
                {
                    checked: false,
                    size: "—",
                    type: "folder",
                    name: "Pictures",
                    lastModified: "2025-05-30",
                    rows: [{
                            checked: true,
                            size: "3.5 MB",
                            type: "file",
                            name: "Vacation.jpg",
                            lastModified: "2025-05-15",
                        }, {
                            checked: false,
                            size: "2.1 MB",
                            type: "file",
                            name: "Family.png",
                            lastModified: "2025-05-20",
                        }]
                }
            ]
        }

        delegate: TreeViewDelegate {}
    }
}

SortFilterProxyModel

QMLおよびQt Quick UIにおいてデータを取得・更新する様々な方法が存在する中で、QML内部から直接データをソートおよびフィルタリングする機能が不足しておりました。C++側では、QSortFilterProxyModelがモデル/ビューフレームワークの初期段階から存在しておりました。Qt 6.10では、宣言的でバインディングに適したAPIを通じて、この優れたソートおよびフィルタリング機能の多くをQMLにも導入いたします。

ListModel {
    id: colorModel
    ListElement { color: "blue" }
    ListElement { color: "green" }
    ListElement { color: "red" }
    ListElement { color: "yellow" }
    ListElement { color: "orange" }
    ListElement { color: "purple" }
}

SortFilterProxyModel {
    id: colorFilter
    model: colorModel
    sorters: [
        RoleSorter {
            roleName: "color"
        }
    ]
    filters: [
        FunctionFilter {
            component CustomData: QtObject { property string color }
            property var regExp: new RegExp(colorSearch.text, "i")
            onRegExpChanged: invalidate()
            function filter(data: CustomData): bool {
                return regExp.test(data.color);
            }
        }
    ]
}

QMLのSortFilterProxyModelについて詳しくは、QMLモデル活用:リアルタイム並び替え・フィルタリングのブログ記事をご覧ください。

製品を最新の状態に 維持しましょう

オペレーティングシステムは進化を続けており、ユーザーは更新されたデバイスと最新のシステムソフトウェア上で、お気に入りのソフトウェアを実行できることを期待しております。

Android開発者向けの改善点

Qt 6.10では、Androidプラットフォーム向けの開発をより開発者にとって使いやすいものにする数々の機能強化が含まれております。最新のAndroidバージョンへの対応が追加され、アプリの良い第一印象を簡単に作成できるようになりました。

Android 15 および 16 のサポート

Qt 6.10 ではAndroid 15 および 16 を正式にサポートします。これにはビルドシステムの更新や 16K ページサポートが含まれており、最新の Android デバイスを対象とした開発が可能となります。このサポートにより、進化を続ける Android エコシステム全体において、Qt アプリケーションの安定性とパフォーマンスが維持されます。

Qt Jenny 1.0

Qt Jenny 1.0は、Android Java APIをQtアプリケーションに統合する作業を簡素化する新たなツールです。JNIグルーコードのコードジェネレータとして機能し、注釈付きJavaクラスからQt C++ APIを自動的に生成することが可能です。Qt Jennyはコンパイラとアノテーションプロセッサで構成され、QtコードからBatteryManagerPowerManagerAudioManagerといったAndroidネイティブサービスへのアクセスを実現します。生成されたコードはQJniObjectを利用し、JNI経由での実装が非常に複雑な通知機能もサポートします。Qt JennyはMaven Central経由で入手可能で、Qt Creatorおよびオンラインドキュメントにサンプルが用意されており、開発者の迅速な導入を支援します。

スプラッシュ画面処理の改善

Android 12でデフォルトのスプラッシュ画面APIが導入されたため、QtアプリケーションではAndroidのスプラッシュ画面とQtのスプラッシュ画面が二重に表示されないよう注意が必要でした。Qt 6.10 では、Android のスプラッシュスクリーンから Qt のスプラッシュスクリーンへスムーズに移行するためのサンプルとガイダンスを提供しています。これには、専用の SplashActivity の使用、半透明効果のためのテーマのカスタマイズ、Android の準備が整った後にのみ Qt アクティビティを起動することが含まれます。その結果、特にクロスプラットフォームアプリケーションにおいて、より洗練され一貫性のある起動体験が実現されます。

macOS および iOS 26

Qt 6.10 は、わずか数週間前に macOS 26 「Tahoe」 がベータ版を脱して以来、Qt 初のマイナーリリースとなります。6月の発表以来、ここ数ヶ月間、最新の macOS および iOS バージョン上で Qt アプリケーションが良好に動作するよう、取り組んでまいりました。

新しいLiquid Glassデザインシステムと、macOSにおける基盤となるレンダリングアーキテクチャの変更は、いくつかの課題をもたらしましたが、QtにおいてmacOS 26を完全サポートプラットフォームとして追加できています。多くの改善点は、LTSブランチの今後のパッチリリースにも反映される予定です。また、macOS 26はQt 6.8およびQt 6.5のリリースでもサポートされます。

WindowsのQt WebViewとWebView2サポート

Windowsでは、Qt 6.10によりQt WebViewモジュールにWebView2ベースの実装が追加されました。QtのWebViewモジュールは、ChromiumベースのQt WebEngineではなくネイティブブラウザエンジンを使用し、Web技術で構築されたUI要素をネイティブQtアプリケーションに簡単に組み込むことを可能にします。WebView2プラグインにより、Qt WebViewはMicrosoft Edgeをレンダリングエンジンとして使用できるようになり、Qt WebEngineを同梱せずにWindows向けにこのようなアプリケーションを展開することが可能となりました。

 

Qt Multimediaによる優れたオーディオ性能

Linuxシステムにおいて、PipeWireは最新のマルチメディアフレームワークであり、パフォーマンスとレイテンシの改善、コンテンツ処理やハードウェアの制御・管理の向上、コンテナ化されたアプリケーションのサポートを提供します。Qt Multimediaはこのシステム向けのバックエンドを提供します。さらに、オーディオピッチ補正機能を実装し、加速または減速されたトラックを再生する際、エンドユーザーにより優れたオーディオ品質を提供します。

組み込みターゲットハードウェアの更新

デバイス開発者の皆様には、Boot to QtがYocto 5.2「Walnascar」をサポートするようになったこと、また各種Ezurio Nitrogenボード向けのハードウェア適応を追加したことをお知らせします。

その他の特徴

Qt Quick 3Dでは、高品質なレンダリングと高いパフォーマンスを実現するライトマップのベイク処理が容易に行えるようになりました。また、パーティクルエフェクトを逆再生することで、雨や雪がモデルに衝突する効果を表現できます。

Qt Graphsでは、塗りつぶしサーフェス型の追加、複数軸のサポート強化、2Dにおけるカスタマイズ可能なZオーダー、3Dグラフのスライスを印刷可能な画像としてレンダリングする機能が追加されました。

Qt Widgetsでは、カスタムデリゲートの実装やアイテムビューにおけるドラッグ&ドロップ機能の制御が容易になり、レイアウトのサイズ制約を個別に設定できるようになりました。

Qt 6.10の仮想キーボードにはラトビア語キーボードレイアウトが追加されました。

Qt Coreではロケール、XMLドキュメント、継続チェーンの処理に関する多数の改善が行われています。

新APIおよび機能の完全なリストは、ドキュメントでご確認いただけます。

感謝

Qt 6.10の実現にご協力いただいたすべての貢献者の皆様に、心より御礼申し上げます。Qtソースコードへのパッチを反映させたコミュニティメンバーの完全なリストは、リリースノートの末尾でご確認いただけます。

特に、バグの報告、フィードバックの提供、または使用事例の共有を通じてQtの改善にご協力いただいた皆様に心より御礼申し上げます。そして最後に、今回のリリース実現に関わった全ての方々に深く感謝いたします。

今すぐにアップグレード!

新バージョンは、従来通りQtインストーラーからご利用いただけます。また、ダウンロードサイトまたはQtアカウントページからも入手可能です。


Blog Topics:

Comments