Qt 6.5 向けに、ソースコード非互換の修正を行いました

はじめに

Qt の開発は初期のころから「メジャーバージョンが同じものではソースコードもバイナリも互換を保つ」という方針で行われています。

例えば、2012年にリリースされた Qt 5.0.0 で開発したプログラムは、2022年にリリースされた Qt 5.15.12 でも「ソースコードを書き換えることなく」もしくは「コンパイルしなおすことなく」動くということになります。

互換性を保つための技術的な詳細や指針は、KDE プロジェクトの Policies/Binary Compatibility Issues With C++ という Wiki 上のページにまとまっています。

(たまに、意図せずに互換性が失われ、修正されることもあります

この方針のため、Qt に対する機能の追加やバグの修正を行う際には、互換性を壊さないように配慮して行っています。

(互換性を保つための技術的な詳細や指針は、KDE プロジェクトの Policies/Binary Compatibility Issues With C++ という Wiki 上のページにまとまっています)

なんらかの理由により、互換性を失う変更が必要な際には、次のメジャーバージョンで行う必要があります。

先日 QtMultimedia に対して Fix clazy warnings that signal shouldn’t be const という修正を行いましたが、これはバイナリ非互換の変更のため、 Qt 6 では互換性を保ちつつ Qt 7 では対応が機能するような仕組みになっています。

Qt 6 に対してソースコードの互換性を壊す変更をしました

前述のとおり、Qt では互換性を壊す変更は基本的には行わないのですが、理由と影響の大きさ(小ささ)によって受け入れられることがごくたまにあります。

(例:Qt 6.2.0 では、QKeyCombination というクラスに対して、ソースの互換性を失う可能性のある変更 が行われました)

今回私が行った変更は、Qt 6 の QApplicationautoSipEnabled() に対しての修正です。

このメソッドは、プロパティのゲッター関数になのですが、なぜか public slots: のスコープに存在していたため、スロットとして動作するようになっていました

これは明らかに間違いなので、Move QApplication::autoSipEnabled() to public scope という変更で、本来あるべき public: スコープに移動しました。

技術的にはソースコード非互換の修正となりますが、(おそらく)以下の理由により Qt 6 に取り込むことができました。

  • 明らかな間違いで、本来あるべき姿に戻したい
  • マイナーな機能で、そもそも利用者が少ない
  • 利用者の中に、このメソッドをスロットとして使っている人なんていないだろうと推測される

世の中で、この互換性を失うことによる影響を受ける人は1人もいない気がします。

この変更は(もっとちゃんと ChangeLog 書けという指摘に対応して)無事 Qt 6 に取り込まれ、2023年3月にリリース予定の Qt 6.5 に含まれる予定です。

もし、この変更に伴う影響がなにかありましたら、Qt のバグレポート を書いていただければと思います。