web-dev-qa-db-ja.com

QWindowとQWidgetの違いは何ですか

Qt 5.0は新しいQWindowクラスを提供します。このクラスのドキュメントは非常に包括的ですが、QWindowQWidgetクラスとどのように正確に異なるか、そして前者を好む場合は見逃しています。どちらも画面にあらゆる種類の物を視覚化する便利な方法を提供し、描画にQPainterを使用でき、OpenGLと対話する方法を備えています。

APIの説明 には、次のように記載されています。

アプリケーションは通常、UIにQWidgetまたはQQuickViewを使用し、QWindowを直接使用しません。

したがって、それはウィンドウにとってはメリットのようには思えません。さらに、それは述べています:

Windowsは大量のメモリを使用する可能性があります。通常の測定は、幅×高さ×色深度です。ウィンドウには、ダブルバッファリングとトリプルバッファリングをサポートする複数のバッファ、および深度バッファとステンシルバッファも含まれる場合があります。

QWindowを使用することに賛成ではないようです。それでは、どのような場合にそれを使用しますか?

29
Yellow

QWindowは、gui /ウィジェットの分割により、Qt 5.0で導入されました。 QWidgetは独自のライブラリ(QtWidgets);に存在するようになりました。非ウィジェットベースのアプリケーションには「トップレベルウィンドウ」の抽象化を提供する必要があったため、QWindowが作成され、QtGuiに存在します。

非ウィジェットベースのアプリケーションのクラス全体があります:QtQuick2を使用するすべてのアプリケーション。それらはQtWidgetライブラリをまったく使用しません。実際、それらを使用するときは常に何らかの方法でQWindowsを明示的に使用しています(QQuickViewQWindowから継承します)。

ウィジェットを使用している場合でも、QtカーネルによってトップレベルのQWindowsが作成されます。これにより、対応するトップレベルのQWidgetsと同期するこのようなQWindowオブジェクトのプロパティとフラグも保持されます。これにより、QWindowについてまったく知らなくても、いつものようにウィジェットを処理できます。既存のアプリケーションは期待どおりに動作し続けます。

(これまでのところ)QWindowsを明示的に使用している唯一の理由は、非常に具体的な使用例純粋なOpenGLコンテンツを描画するためです。これは(ウィンドウのOpenGLサーフェスタイプを設定することにより)非常に簡単に実現でき、追加の依存関係(QtWidgets、QtOpenGLなど、ライブラリサイズの点でコストがかかる)をもたらすことを回避します。 これにより、OpenGLの描画面を10行のコードで作成できますこれは、Linux、Windows、Mac、QNX、「組み込みLinux」などで機能します。 Android and iOS too。この観点から、それは完璧なSDLの置き換えとして機能します。:)

67
peppe