2009-03-24 9 views
4

私はしばらくQTを使用してきましたが、私はWindowsでGUIを描く方法について何か不思議に思っていました。
QPainterを使用して、実際にすべてのボタン、編集ボックス、コンボボックス、チェックボックス、タブなどをペイントしていますか、それとも何らかの形でネイティブウィジェットを使用していますか?Qt GUI内部 - ウィジェットペインティング?

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

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

答えて

7

Windows XPおよびVistaの場合(ただし、ディスプレイ設定がClアシック)、QWindowsXPStyleQWindowsVistaStyleによるウィジェットペインティングは、実際に低レベルのテーマ固有の描画(uxtheme.dll)を使用します。プッシュボタンはネイティブのように見えます。古いバージョンのWindowsでは、QtはウィジェットのペインティングをQWindowsStyleでエミュレートします。

状況はMac OS Xでも似ていますが、QMacStyleはAppearance Managerを使用してウィジェットの低レベルのペインティングを委任しています。

X11では、通常、Qtは独自のスタイルペインティングを使用し、いくつかのウィンドウシステムをエミュレートする特定のスタイルを持っています。 QMotifStyleは実際にはロードされずにMotifと同様の外観を持ち、Motif環境に依存します。しかし、GNOMEで動作している場合、オプションでQtはQGtkStyleでネイティブGtk +テーマを使用できます。

4

QWindowsXPStyle documentationが、これは言っている、「警告:。それは、Windows XPのスタイルのエンジンを使用するため、このスタイルは、Windows XPプラットフォームでのみ使用可能です」

Qt Wikipedia pageが言うにこれを持っている:

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

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

1

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

関連する問題