はじめに
アドベントカレンダーも早いもので、17日目となりました。いつも投稿が遅くてごめんなさい。
昨日は、@sazus さんによる「使ってみよう!Qt for Python」でした。Qtコミュニティが作成しているバインディングという珍しい立ち位置ですが、注目度は高いようですし、年末にでも記事を読みながら試してみたいなと考えています。
さて、本日は、穴埋め記事ということで、急遽何か書こうと考えていたのですが、いまいち短時間でかけるネタを思いつかなかったので、昨年に引き続きバージョンアップ情報等を記載していきます。
2018年のバージョンアップ一覧
その前に
バージョンアップの中に出てくる単語のいくつかを先にご紹介
Unicode 10
2017年にバージョンアップしたUnicodeで、8518文字が追加され、新たなレイアウトなどの仕様が追加されています。新絵文字56種類追加とか、縦書きに対応とか話題になっていたかと思いますが、hermit4はすっかり何だっけ状態だったので・・・。
SIMD命令
Single Instruction, Multiple Data streamsの頭文字を取ったもので、1つの命令で複数のデータに対する同じ処理を同時実行するCPU命令の事です。グラフィックスや動画、音声などの処理によく利用される命令です。
QVarLengthArray
配列長が実行時に決定する固定長配列用クラスです。
C言語の規約上、固定長配列はコンパイル時にサイズが確定している必要がありました。このため、以下の書き方はC言語では禁止されていました。
int myfunc(int n)
{
int table[n + 1]; // 誤りです
...
}
一部のコンパイラが独自拡張で対応していたり、C++11ではオプションとして対応が可能とされていたようですが、すべての環境で利用できるわけではありません。
こういう場合の対応は、newやmallocを使うか、std::vector/QVectorを使う事になるわけですが、vector系は可変長のために冗長な処理があり、より良いものとしてboost::arrayやQVarLengthArray 等が用意されたわけです。
int myfunc(int n)
{
QVarLengthArray<int, 1024> array(n + 1);
...
}
のように利用します。
Move-only型
コピーコンストラクタが禁止されている型のこと。
例えば、std::unique_ptrは、指定されたリソースへのポインタの所有権を唯一持っているように振舞うスマートポインタで、コピーを禁止しています。
MQTT
Message Queueing Telemetry Transport。TCP/IP上で利用できる通信プロトコルで、軽量なプロトコル。ただし単独ではセキュリティ機能を持っていないため暗号化などは別途必要。Qt for Automationでサポート
KNX
インテリジェントビルのためのOSIベースのネットワーク通信プロトコル。ビルオートメーションの世界標準なんだそうですが、日本ではECHONET Liteが普及している影響で、まだ知名度は低い模様。Qt for Automationでサポート
OPC UA
Object Linking and Embedding for Process Control Unified Architecture
プラットフォームへの非依存で拡張性の高い、マルチベンダー製品間や、異なるOSにまたがってデータ交換を可能にする高信頼の産業通信用のデータ交換標準。Qt for Automationでサポート予定(テクノロジープレビュー)
Qt 5.11
新機能(既存機能の変更点を含む)
- Qt Core
- [QTBUG-52244] QFileのopen()にQIODevice::NewOnly と QIODevice::ExistingOnly オープンモードフラグを追加しました。ファイルを開く際、アトミックにファイルが存在する場合(NewOnly)、ファイルが存在しない場合(ExistingOnly)をチェックし、open()関数がfalseを返す事ができるようになりました
- QFloat16 に、実行時に利用可能であればSIMD命令を使ってfloatとfloat16のバルク変換を行なう2つのメソッドが追加されました
- QVarLengthArray の prepend() と insert() にrvalue参照型を追加し、std::unique_ptrのようなコピー不可/ムーブのみ可能な(Move-only)型の利用ができるようになりました。
- QVector の prepend() と insert() にもrvalue参照型を追加しました
- QUuid の toString() と toByteArray() に生成フォーマットを指定できるようになりました
- QString, QChar, QTextBoundaryFinder の内部で利用されるUnicodeサポートが、Unicode 10と互換性を持つようになりました。
- 具象化されたモデルクラスによるindexの整合性チェック用にQAbstractItemModel::checkIndex() が追加されました
- Qt Network
- iOS11以降に(セキュアトランスポート経由の)ALPNがサポートされ、HTTP/2ネゴシエーションがサポートされました。
- QNetworkRequestに最初のネゴシエーション以外でHTTP/2 接続を始めるためのHttp2DirectAttribute が追加されました。
- Qt QML
- コンパイラのパイプラインを書き換えました。ASTからバイトコードを直接生成し、これを中間表現として保存するようになります。
- JSコールの処理を最適化し、小さな関数を呼び出す処理が大幅に改善されます。
- 新しいバイトコードインタプリタによりパフォーマンスが大幅に向上しました(Qt 5.10のJITの80〜90%)
- .qmlcファイルは完全にプラットフォーム非依存となり、アセンブリではなくバイトコードを格納するようになりました。
- 繰り返し実行されるバイトコード用に最適化されたアセンブリを生成する新しいホットスポットJITになっています。
- CONFIG + = qtquickcompilerはコンパイル時に生成されたバイトコードを埋め込むことで、** オープンソース版でも動作するようになりました **
- Qt Quick
- 画像要素に圧縮テクスチャを読み込むためのサポートが拡張されました。.ktxと.pkmの両方のコンテナファイル形式をサポートするようになりました。
- Qt Quick Controls 2
- AbstractButton
- autoRepeatDelayプロパティとautoRepeatIntervalプロパティが追加されました
- autoRepeatプロパティをButtonからAbstractButtonにプロモートしました
- [QTBUG-62811] pressXとpressYプロパティを追加して、プレスポイントをQMLに公開しました
- ButtonGroup
- [QTBUG-56295] [QTBUG-63782] checkStateプロパティを追加しました。グループ全体のチェック状態を組み合わせて示します
- CheckBox と CheckDelegate
- [QTBUG-56295] checkStateをQt.PartiallyCheckedに設定した際にtristateがtrueにしないようになりました。これにより、インタラクティブな3ステートにすることなく、部分的にチェックされた状態にすることが可能になります。
- [QTBUG-63238] nextCheckState()を実装しました
- ScrollBar と ScrollIndicator
- [QTBUG-56557] minimumSize、visualSize、およびvisualPositionプロパティが追加されました
- SpinBox
- TextFromValue()JS関数を呼び出す必要がなく、テキストバインディングを作成してテキスト値を表示できるようにするためのdisplayTextプロパティを追加しました
- AbstractButton
- Qt 3D
- CPU使用率を減らし、パフォーマンスを向上しました
- QAbstractClipAnimatorのnormalizedTimeプロパティでアニメーションをスクラブできるようになりました
- ワールド空間またはスクリーン空間で任意のレイキャストを発行します
- SIMD命令を改善しました
- Qt Location
- 実験的なturn-by-turnナビゲーションAPIを導入しました
- 実験的なQQuickItem-less mapオブジェクトをサポートしました
- Routing and Places APIが拡張可能になり、サービス固有の情報を返すことができるようになりました
- アプローチの角度など、ルートクエリで追加のウェイポイント情報を指定するためのNew Waypoint要素が追加されました
- QTBUG-62086 および QTBUG-65833の修正。MapItemView がQQmlDelegateModel ベースとなりました。
- MapPolyline のパフォーマンスが大幅に改善しました
- レイヤーがマップアイテムと組み合わせて正しく動作するようになりました。アンチエイリアスとアーティファクトの少ない透過が可能になりました
- Geocoding と Places がMapboxプラグインをサポートしました
- Qt WebEngine
- Chromium 65ベースに更新されました
- portと別ブラウザを使う事無くDevToolsを埋め込めるようになりました
- インストール可能なクッキーフィルター
- クォータのアクセス許可
- qdoc
- C/C++ コードのパースをlibclangに変更しました
- Qt Designer
- [QTBUG-34610] IDベースの翻訳サポートが追加されました
- Qt GUI
- Windowsデスクトップでは、ユーザー補助機能のサポートが更新され、大幅に改善されました。実装ベースが、Microsoft UI Automation(以前はMicrosoft Active Accessibility)に変更になっています。
- Windowsデスクトップ上で利用可能なウィジェットのテーマは、いくつかのレンダリング問題の修正とHigh-DPIディスプレイをより良くサポートするように更新され、外観と機能が向上しました
- Linux Printingは、QPrintPropertiesDialog(QTBUG-54464)の詳細タブでより多くのCUPSオプションをサポートし、多くの追加設定(任意のページ範囲QTBUG-1311)を可能にしました
- Unicode 10に準拠するようにUnicode双方向テキストアルゴリズムを更新しました
- Qt Widgets
- QLineEditにマウスによるクイック・テキスト選択を追加
- Qt Serial Bus
- コンピュータと車両間の通信用のJ2534 Pass-Thru CANプラグインを追加
- プラグインでサポートされているQCanBusDeviceInfoにdescription, serial number, channelが追加されました
- "qt.canbus"と "qt.canbus.plugins."フィルタで有効にできるCANバスモジュールへの分類されたロギングを導入しました。
- QCanBusFrame::isValid() がCAN FDのペイロード長をチェックするようになりました。
- Qt Bluetooth
- BlueZ's DBus LE API(BlueZ 5.42以降)を使い、 Bluetooth Low Energy Centralを実装しました
- Qt Test
- モデルクラステスト用ヘルパーのQAbstractItemModelTesterを追加しました
新規モジュール
追加はありません
プラットフォームの変更点
- JIRA tracking
- コードベースからMSVC2013のサポートが削除されました
- QNX 6.6 のサポートが終了しました(QNX 7はサポートされています)
- macOS 10.10 のサポートが終了しました
- Windows上のQt WebEngineのコンパイルにはMSVC 2017が必要です
- Windows UI Automationフレームワークの採用により、Win32でのアクセシビリティサポートが改善されました
- XCB
- dasia や diaeresisのような不明な'dead keys'がサポートされます
- eglfs
- XRGB8888(RGB565、ARGB8888)以外のフレームバッファフォーマットのサポートが追加されました
- 実験的なスクリーンクローニングのサポートを追加
- DRMレンダーノード(/dev/dri/renderDnn)をアプリケーションに透過的なヘッドレスモードで操作するためのサポートを追加
- ルネサスR-Car M3のメイク仕様を追加
- ルネサスデバイス上のVSP2を介して他のハードウェアレイヤとQtコンテンツを合成する実験的バックエンドを追加
テクノロジープレビュー
- Qt Remote Objects (TP3)
プロセスやデバイス間におけるシグナルとスロットやプロパティ等のQObjectインターフェース共有機能 - Qt WebGL Streaming Plugin (TP2)
アプリケーション表示をネットワーク越しにブラウザへストリーミングする機能
非推奨機能(削除予定)
現状提供されていますが、将来的に削除予定の機能です。新規アプリケーションでの利用が非推奨な機能となります。
- Qt Script
- Qt Quick Controls 1
Qt 5.12
新機能(既存機能の変更点を含む)
- Qt Core
- 既存のJSONサポートと同様にCBORデータをサポートします
- QCryptographicHashにstaticなhashLengthを追加しました。これは、ハッシュの出力の長さを返します
- ユーザーコードのワイルドカード実装を容易にするために、wildcardToRegularExpressionヘルパーメソッドをQRegularExpressionに追加しました。
- ユーザーコードのより正確なマッチング実装を容易にするために、anchoredPatternヘルパーメソッドをQRegularExpressionに追加しました
- QSortFilterProxyModelにQRegularExpressionサポートを追加しました
- Qt GUI
- WinRT QPAへのWindows UI Automationへのサポートを追加し、QtベースのUWPアプリケーションがアクセシビリティおよびプログラムUIコントロールツールで動作できるようにしました
- タブレット/タッチスクリーン/タッチパッド/マウス入力の処理を、Windows 8以降のWindowsポインタ入力メッセージに基づく統一された実装に置き換えました。MS Surface Lineのスクリーンデジタイザーのようなハードウェアは特別なドライバーなしでサポートされるようになります
- https://webgradients.com/ に基づくQGradientのプリセットを追加
- Imageに4xU16 RGBA64形式を追加し、PNGおよびTIFFから読み込み、OpenGLからアップロードまたは取得ができるようなりました
- Qt Network
- UDPをサポートするDTLS(Datagram Transport Layer Security)を追加しました
- セキュリティトランスポートバックエンドに再ネゴシエーションを追加しました
- セキュリティトランスポートバックエンドにALPNサポートとHTTP / 2プロトコルネゴシエーションを追加しました
- ジェネリックSSLバックエンド(WinRTとセキュアトランスポート)にPKCS#8のサポートが追加されました
- QPasswordDigestor:パスワードベースのキー導出関数(現在はPBKDF1とPBKDF2)を含む新しい名前空間を追加しました
- Qt QML
- JavaScriptエンジンがECMAScript 7をサポート
- ECMAScriptモジュールが、 QJSEngine::importModule()を使って直接ロードできるようになり、拡張子 .mjs を使えば、.qmlファイルからインポートできるようなりました
- Qt Quick
- Pointer HandlersはInput Handlers(このカテゴリには既存のKeys添付プロパティを含む)に名前が変更され、Qt QuickのファーストクラスのQML機能として完全にサポートされるようになります(C++のAPIはまだ公開されていません)。
- HoverHandlerは、マウスのホバーを検出するための新しいタイプのハンドラーです。深いネスティングの場合でもホバーを検出できます.MouseAreaと異なり、HoverHandlersを使用して複数のネストされたアイテムを同時にホバーすることができます(たとえば、サイドバーとサイドバー上の個々のボタン)
- DragHandler はマルチポイントハンドラになりました。たとえば、minimumPointCountを2に設定すると、2本指のドラッグにのみ反応します。例えば、これを使うと自由な設定ができるようになります。例えば、片手でドラッグするとアイテムの一般的な動きができ、2本の指でドラッグすると何か他のことができます(例えばチルトの角度を変更します)
- 高速起動のために、事前に生成されたdistance fieldキャッシュのサポートが追加されました
- ItemViewの別のタイプとしてTableViewを追加しました.ListViewと同じですが、複数の列があります。QtQuick Controls 1.xのものとは異なり、スタイリングは行われません。むしろ、行と列をスクロールするときにデリゲートをオンデマンドでインスタンス化(およびプールと再利用)するための最適なソリューションを提供します
- テクノロジプレビュー:DelegateChooserを、モデルビューの役割ビュー(TableViewなど)で、またはインデックスに応じて異なるデリゲートを選択する手段として追加しました
- Qt Quick Controls 2
- Dial: inputModeプロパティを追加しました。このメソッドは、水平方向と垂直方向の2つの新しい操作方法を追加します。これらの新しい入力モードでは相対入力システムが使用されます。これは、古い入力システムとは異なり、ダイヤルの位置の変更分がその値に「追加」されることを意味します。これにより、音声レベルを調整するときのように、不適切な操作で不安定になり"jumpy"になるといった事なく安全に操作できるようになります。
- Control, Popup:topInset、bottomInset、leftInset、およびrightInsetプロパティを追加して、paddingがcontentItemのジオメトリを制御する方法と同様にバックグラウンドのジオメトリを制御します
- 複雑な暗黙的なサイズのバインディングを単純化するために暗黙の* WidthプロパティとImplicit * Heightプロパティ(例えばimplicitHeaderWidth、implicitContentWidthなど)を追加しました
- SwipeView、DialogButtonBox:contentWidthプロパティとcontentHeightプロパティが追加されました
- RangeSlider:valueAt()関数の追加。live が false(スライダからコピーされた)に設定されている場合、各ハンドルのツールチップに最新の値を表示できます
- RangeSlider: Sliderのmovedのような first.moved() と second.moved() シグナルの追加。
- Control: 明示的に指定しない限り、baselineOffsetは、コントロールの上部パディングとcontentItemのbaselineOffsetに基づいて自動的に更新されるようになりました。スタイルはQMLでbaselineOffsetを指定する必要がなくなりました
- Popup: anchors.centerInを追加すると、ポップアップを便利にセンタリングすることができます
- QQuickStyle:使用可能なスタイルを検索するディレクトリのリストを管理するためのstylePathList() およびaddStylePath() メソッドを追加しました
- Slider, RangeSlider: スライダのハンドルのタッチドラッグを開始するためのしきい値を設定するためのtouchDragThresholdプロパティを追加しました。マウスのドラッグはプロパティの影響を受けません
- TextArea, TextField: placeholderTextの色を背景に合わせてカスタマイズするための、ユーザーの便宜のためのplaceholderTextColorプロパティを追加しました
- Material:デスクトッププラットフォームで使用するMaterialスタイルのDenseバリエーションを追加しました。いくつかのコントロールは、高さがやや小さく、フォントサイズを小さくしています。バリアントは、QT_QUICK_CONTROLS_MATERIAL_VARIANTをDenseに設定するか、qtquickcontrols2.confファイルでVariant = Denseを設定することで有効にできます
- DialogButtonBox: buttonLayoutプロパティを追加して、ボタンを配置することができます。
タンブラー:ラップの値に応じて、それぞれのPathView / ListView関数を呼び出すpositionViewAtIndex()関数を追加しました。これにより、アニメーションなしでcurrentIndexを変更することができます - Tumbler: ラップの値に応じて、それぞれのPathView / ListView関数を呼び出すpositionViewAtIndex()関数を追加しました。これにより、アニメーションなしでcurrentIndexを変更することができます
- Control, Popup: horizontalPaddingプロパティとverticalPaddingプロパティを追加して、左と右、上と下の両方のパディングを一度に簡単に設定できます
- ToolTip:非接続のツールチップを特定のパラメータで表示する際に、同じレベルの利便性を提供するために、非接続のshow()メソッドとhide()メソッドを追加しました
- Qt Serial Bus
- CANハードウェアなしでシミュレーション用の仮想CANバスプラグインを追加
- canbusutilに設定オプションを追加しました。例えば、ビットレート設定
- PeakCANプラグインにCAN FD機能を追加
- QCanBusDeviceにreadAllFrames()およびclear()関数を追加
- Qt WebEngine
- Chromium 69に更新されました
- カスタムURLスキームのタイプとセキュリティを設定するためのQWebEngineUrlSchemeインターフェース対応
- WebActionsを公開
- ダウンロードが開始されたビューまたはページは、ダウンロードアイテムから読み取ることができるようになりました
- クライアントSSL証明書がサポートされ、macOSおよびWindowsのシステム設定およびLinuxのNSSデータベースから読み取られるようになりました
- Qt Labs Platform
- Menu、MenuItem、SystemTrayIcon:推奨されないiconNameおよびiconSource。icon.nameとicon.sourceのグループ化プロパティ
- Menu、MenuItem、SystemTrayIcon:added icon.maskグループ化されたプロパティ
- Qt Virtual Keyboard
- 仮想キーボード用の拡張インターフェースを導入しました。すべてのInput Methodといくつかの特別なキーボードレイアウト(例えば、Hunspell、OpenWnnなど)は拡張機能に移動されました。拡張インターフェイスを使用すると、サードパーティは仮想キーボードを変更または再構築することなく、新しい入力方法を作成できます。さらに、この変更により、目的の拡張機能をシステムにコピーすることによって、機能と言語を個別に追加することができます
- エクステンションプラグインとリンク可能なvirtualkeyboardモジュールを導入しました。このモジュールは、入力メソッドの作成に必要なC ++ APIを提供します
- プラグインからすべてのスタイルを除外するビルドオプションを追加
- MyScript Superimposed手書き認識のサポートが追加されました。MyScriptは、文字、筆記体、印刷、重ね書きの認識をサポートしています。さらに、それは、連続した断片間の明白な分離なしに、文字、単語または単語の一部を互いに重ねて書かれたものの認識を可能にする。これは、CPUパワーとメモリに関して十分なハードウェア機能を備えた小型デバイスを対象としています
- ベトナムの手書き認識を追加しました
- アルバニア語、アメリカ英語、フランス語カナダ語、インドネシア語、マレー語、ポルトガル語ブラジル、スロバキア語、スロベニア語、スペイン語メキシコ語、タイ語、トルコ語、ベトナム語、ウクライナ語の新しいレイアウトが追加されました
- ロシア語のためのラテンの追加レイアウトを追加しました
- デフォルトでプラグインにpinyin と tcimeの辞書がバンドルされます
- Hunspell用のユーザー辞書と学習を追加
- Qt Bluetooth
- QBluetoothDeviceDiscoveryを使用して製造元データを検出する機能を追加
- Qt 3D
- nameやindexを大量に含むファイルのアニメーションの読み込みに対応
- 定量(ステップ)のアニメーションカーブに対応
- 状況に応じたQNodeの作成と再親子化の修正
- フロントエンドのテクスチャオブジェクトはロードされたテクスチャのプロパティを適切に反映するようになります
- TextureImageはテクスチャの子である必要が無くなります
- シミュレーションループにないときは、CPU使用率が削減されます
- EntityLoaderは、コンポーネントからだけでなくファイルからもロードできるようになりました
- OpenGL ES 3.1のレンダラサポート
- レンダラのバックエンドでのパフォーマンスとバグ修正
- Qt Wayland Compositor
- xdg-shell安定版(および非推奨の不安定版v5)のサポートが追加
- xdg-decoration-unstable-v1のサポートをサーバー側のウィンドウ装飾に追加
- Qt Websockets
- QWebsocketに "bytesToWrite"関数を追加
- Qt Location
- MapboxGLプラグインがQNX7をサポート
- MapItemViewにtransitionのadd/removeを追加
- MapItemViewはMapItemGroupをサブクラス化し、それ自体にネスト可能になりました。それ自体のデリゲートとしても使用できます
- PlaceSearchModelでは、ページを切り替えるだけでなく、モデルを段階的に読み込むことができます
- Map.visibleAreaを導入して、地図の可視領域を制限できます
- MapItemのgeoShapeプロパティはRead/Writeになりました。基本クラスには仮想セッターがあります
- QGeoPolygonのinner holesのサポートが追加されました。これらは現在、MapPolygonによってMapboxGLプラグインのみで使用されています。ビルドーインのレンダラーによりサポートされます
- 徒歩ルートのサポート
- Qt Test
- std :: tupleのエラーは、QCOMPAREを使用しているときに明示されるようになります
新規モジュール
- Qt Remote Objects
- Qt WebGL Streaming Plugin
プラットフォームの変更点
- QTimeZone
利用可能であれば、MicrosoftのネイティブAPIよりもICUを利用するようになりました。 - macOS
- QSurfaceType::MetalSurface のサポートが追加
- MoltenVKを使用するQSurfaceType::VulkanSurfaceおよびQVulkanWindowのサポートを追加
- Wayland
- xdg-shell安定版(および非推奨の不安定版v5)のサポートが追加されました
- デフォルトのウィンドウ装飾を改善
- Wayland拡張機能のサポートが追加されました
- xdg-decoration-unstable-v1
- xdg-output-unstable-v1
テクノロジープレビュー
- Qt for WebAssembly (TP2)
WebAssemblyをサポートするブラウザ上で動作するQtアプリケーションコンパイル用のプラットフォーム追加
非推奨機能(削除予定)
現状提供されていますが、将来的に削除予定の機能です。新規アプリケーションでの利用が非推奨な機能となります。
- Qt Script
- Qt Quick Controls 1
- Qt Canvas 3D
Qt for Automation
- Qt MQTT
- MQTTプロトコル・レベル5の完全サポート
- Qt KNX
- KNXnet / IPコアバージョン2のサポート
- KNXnet / IPルーティングバージョン1のサポート
- KNXnet / IPトンネリングバージョン2のサポート
- TCPによるKNXnet / IP通信のサポート
- Tech Preview:KNXnet / IPセキュアプロトコルの基本サポート
- Qt OPC UA(TP)
- イベントのサポート
- バッチ読み取りAPIの追加
- バッチ書込みAPIの追加
- TranslateBrowsePathsToNodeIds APIの追加
- ブラウズAPIの改善
- ArgumentおよびExpandedNodeIdタイプのサポート
- ExpandedNodeIdからノードをインスタンス化できるようになりました
- 多次元配列のサポートが修正されました
- 拡張オブジェクトの読み書きをサポート
あとがき
今回は穴埋めということで、例によって大雑把翻訳の適当記事でごめんなさい。全体的に見てQtは車載向けへの強化をしつつ、QML/Qt Quick周りのパフォーマンスチューニングやQt Quick Control2の強化などが見受けられます。
新規に追加されたモジュールとしては、WebGL StreamingとWebAssemblyというブラウザ向けの機能が入り始めています。まぁ、ネタ的には面白いのですけど、安定して動作するようになるまで、どれほど時間がかかるのでしょうね。
個人的にはQt for Automationが気になっています。できればSECS/GEM周りを実装していただけると・・・げふん。
明日は、@tetsurom さんによる「QIconでSVGを表示する」です。お楽しみに。