Qt 5におけるモジュールインポートの仕様
Qt 5環境では、QMLモジュールをインポートする際にメジャーおよびマイナー番号の指定が必須となります。これは、APIがマイナーバージョンごとに進化し、互換性が保たれる仕組みになっているためです。
例として、以下のような記述が求められます。
import QtQuick 2.15
import Qt.labs.settings 1.0
主な特徴は以下の通りです。
- バージョン番号を省略するとインポートエラーが発生します。
- APIの安定性はバージョン番号に依存しています。
- 当時、
SettingsはQt.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)。