4

私はしばらくの間QTを使用していて、WindowsでのGUIの描画方法について何か疑問に思っていました。
QPainterを使用して、すべてのボタン、編集ボックス、コンボボックス、チェックボックス、タブなどを実際に単独でペイントしているのでしょうか、それともネイティブウィジェットを使用しているのでしょうか。

カスタムスタイリングとスキニングを実行できるという事実は、実際にはQPainterを使用してすべてを描画することを示唆していますが、この種のコードをどのように維持できるでしょうか。Qt開発者は、ウィンドウシステムの全機能を本当にリバースエンジニアリングしましたか?それはやや無駄ではありませんか?
これに対するもう1つの証拠は、QtGUIでSpy++を使用している場合、すべてのウィンドウが「QWidget」に等しいクラス名で表示されていることです。ネイティブウィジェットを使用している場合、これらは「BUTTON」、「STATIC」などではありませんか?

他のプラットフォームではどうですか?Max OSXでも同じことをしていますか?

4

3 に答える 3

7

Windows XP および Vista (表示設定が Classic に設定されている場合を除く) では、QWindowsXPStyleおよびQWindowsVistaStyleを介したウィジェットの描画は、実際には低レベルのテーマ固有の描画 (uxtheme.dll) を使用して、たとえばプッシュ ボタンがネイティブのもののように見えるようにします。古いバージョンの Windows では、Qt はQWindowsStyleを介してウィジェットの描画をエミュレートします。

状況は、 QMacStyleが Appearance Manager に依存してウィジェットの低レベルの描画を委任するMac OS X でも同様です。

X11 の場合、通常、Qt は独自のスタイル ペインティングを使用し、いくつかのウィンドウ システムをエミュレートする特定のスタイルを持っいます。ただし、GNOME で実行している場合、オプションで Qt はQGtkStyleを介してネイティブ Gtk+ テーマを使用できます。

于 2009-03-24T15:43:21.737 に答える
4

QWindowsXPStyleのドキュメントには、次のように書かれています。

「警告: このスタイルは、Windows XP のスタイル エンジンを使用しているため、Windows XP プラットフォームでのみ使用できます。」

Qt ウィキペディアのページには次のように書かれています。

「ネイティブ UI レンダリング API の使用

Qt は意図したプラットフォームのネイティブな外観をエミュレートしていましたが、そのエミュレーションが不完全な場合にわずかな不一致が生じることがありました。Qt の最近のバージョンでは、さまざまなプラットフォームのネイティブ API を使用して Qt コントロールを描画するため、このような問題は発生しません。[24] (ほとんどのウィジェット機能にネイティブ API を使用する wxWidgets も参照してください。)"

于 2009-03-24T10:16:13.287 に答える
1

実際、Qt はすべてのウィジェット自体をペイントします (プラットフォーム テーマ API を使用するか、「生の」GDI/X/etc を使用するかは問題ではありません)。ネイティブ ウィジェットを使用した場合 (wxWindows のように)、カスタム機能を追加するために既製のウィジェットを使用することは言うまでもなく、スタイリングにフックして細部を変更することはほとんど不可能です。

于 2009-07-21T17:16:58.647 に答える