QMLモジュールのインポート時におけるバージョン指定の有無とQt 5/6の相違点

Qt 5におけるモジュールインポートの仕様

Qt 5環境では、QMLモジュールをインポートする際にメジャーおよびマイナー番号の指定が必須となります。これは、APIがマイナーバージョンごとに進化し、互換性が保たれる仕組みになっているためです。

例として、以下のような記述が求められます。

import QtQuick 2.15
import Qt.labs.settings 1.0

主な特徴は以下の通りです。

  • バージョン番号を省略するとインポートエラーが発生します。
  • APIの安定性はバージョン番号に依存しています。
  • 当時、SettingsQt.labs.settingsに存在しましたが、import Qt.labs.settingsとだけ記述してもエラーになり、必ず1.0等のバージョンを明記する必要がありました。

Qt 6におけるモジュールインポートの仕様

Qt 6では、このインポート機構が簡素化されました。公式モジュールのバージョンはQt自体のメジャーバージョンと紐付けられ、細かなマイナーバージョンによる管理は廃止されています。

そのため、以下のようにモジュール名のみを記述することが推奨されています。

import QtQuick
import QtQuick.Controls
import QtCore

主な特徴と注意点は以下の通りです。

  • バージョン番号の非推奨: Qt 6ではQtCore 6.2.qmltypesのような厳密なバージョン対応ファイルが提供されなくなったため、バージョンを記述するとIDEや静的解析ツールがエラーを報告する可能性があります。
  • ランタイムと静的解析の乖離: C++側のqmlRegisterTypeで登録された動的タイプ(例: Settings)は、バージョン指定の有無に関わらず実行時には正しく読み込まれます。しかし、静的解析ツールは.qmltypesファイルを参照するため、バージョン指定があると「Unknown type(未知の型)」として認識され失敗します。

コード例:設定値の永続化(Settings)

具体的な実装例として、アプリケーションの設定を保存するSettingsコンポーネントの使い方を比較します。変数名や構成を変更して、実際のコードベースに近い形で示します。

Qt 5での実装例

バージョン番号が必須であることを確認してください。

import QtQuick 2.12
import Qt.labs.settings 1.0

Item {
    width: 400; height: 300

    Settings {
        id: appPreferences
        property string userName: "Guest"
        property int volumeLevel: 50
    }

    Text {
        text: "User: " + appPreferences.userName
    }
}

Qt 6での実装例

バージョン番号を省略し、モジュール名だけでインポートします。

import QtQuick
import QtCore

Item {
    width: 400; height: 300

    Settings {
        id: appPreferences
        property string userName: "Guest"
        property int volumeLevel: 50
    }

    Text {
        text: "User: " + appPreferences.userName
    }
}

Qt 6でバージョン指定を行った場合の挙動

もしQt 6環境で以下のように記述したとします。

import QtCore 6.2

この場合、SettingsはC++側で登録されているためアプリケーションは正常に起動しますが、.qmltypesファイルにその特定バージョンの定義が存在しないため、開発環境(IDE)やqmllintなどのツールは型を解決できず警告を出力します。

仕様の比較まとめ

Qtのバージョン インポート構文 バージョン番号 Settingsの記述例
Qt 5 import モジュール major.minor 必須 import Qt.labs.settings 1.0
Qt 6 import モジュール名 非推奨(推奨しない) import QtCore

要点

開発環境のエラーを防ぐため、バージョン指定のルールを厳守してください。

  • Qt 5を使用する場合: 必ずバージョンを指定する(例: Qt.labs.settings 1.0)。
  • Qt 6を使用する場合: バージョンを省略する(例: QtCore)。

7月28日 16:52 投稿