自分でソースからQt 5.8.0をクロスコンパイルし、それを使用してMicrosoft Windowsの Qt Widgets からQt "Dynamic Layouts"の例をビルドすると、実行されているかのように古臭く見えます下の左側のウィンドウに示すように、Windows 2000。ただし、ビルド済みのmingw-w64-x86_64-qt5-staticパッケージ(バージョン5.8.0-1)を使用してまったく同じプログラムを MSYS2 からコンパイルすると、Nice modern Windowsアプリケーションのように見えます、下の右側のウィンドウに示すように。 Qtのバージョンを修正して、それを使用して作成されたGUIが見栄えよくなるようにするにはどうすればよいですか?不足している構成オプションはありますか?
調べる必要があるのは、QWindowsVistaStyle
クラスです。 MSYS2でプログラムをコンパイルしたときに、そのクラスがGetThemeColor
のようないくつかの関数を参照しているため、-luxtheme
を追加する必要があることに気付きました。これらの機能は、Windows Vista以降でのみ使用できます。 Linux上で自分のQtを使用してクロスコンパイルしたとき、そのライブラリは必要なかったので、おそらくそのクラスがビルドで無効にされた可能性があります。
Nixcrpkgsリポジトリの commit f51d834 を使用して、クロスコンパイルされたQtと古い外観の動的レイアウトの例をビルドしました。そのコミットのコードを見ると、mingw-w64クロスコンパイラーのビルド、Qtのビルド、および動的レイアウトを含むQtの例のビルドに実行されたコマンドが正確に表示されます。 Nix をインストールし、ダウンロード nixcrkpkgs をインストールしてからnixcrpkgsディレクトリでnix-build -A pkgs.i686-w64-mingw32.qt.base-examples
を実行すると、自分でビルドできます。あなたは そのコミットでのQtパッケージの私のビルドレシピ を見ることができます。
MSYS2のMINGW64シェルで このスクリプト を実行して例をビルドし、良い結果を得ました。 MSYS2のmingw-w64-x86_64-qt5-staticパッケージに依存しています。 そのパッケージのビルドレシピ を確認できます。
Qt 5.8.0のsrc/widgets/configure.json
ファイルを見ると、uxtheme.h
の存在を確認し、uxtheme.h
がwindowsxp
スタイル。これは、windowsvista
スタイルをコンパイルするための前提条件です。 Qtのconfig.log
を調べたところ、uxtheme.h
テストが失敗したことがわかりました。理由はわかりませんが、uxtheme.h
を単独で含めることができないためと考えられます。事前にwindows.h
を含める必要があります。 Qtを構成した後、src/widgets/qtwidgets-config.pri
ファイルを調べて、windowsxp
およびwindowsvista
スタイルが実際に有効になっていないことを確認しました。コンパイルされるスタイルのリストがあり、windowsvista
はリストではありません。
Qtのconfigureコマンドに-style-windowsxp -style-windowsvista
オプションを追加しようとしましたが、uxtheme.h
テストが失敗し、これらのテーマをコンパイルするための前提条件であるため、これらのオプションはエラーを引き起こします。
私の解決策は、このパッチをQt 5.8.0に適用してuxtheme
テストを完全にスキップすることでした:
diff -ur qt58-orig/src/widgets/configure.json qt58/src/widgets/configure.json
--- qt58-orig/src/widgets/configure.json 2017-05-28 02:07:07.625626151 -0700
+++ qt58/src/widgets/configure.json 2017-06-27 21:25:52.752628339 -0700
@@ -28,11 +28,6 @@
},
"tests": {
- "uxtheme": {
- "label": "uxtheme.h",
- "type": "files",
- "files": [ "uxtheme.h" ]
- }
},
"features": {
@@ -57,7 +52,7 @@
},
"style-windowsxp": {
"label": "WindowsXP",
- "condition": "features.style-windows && config.win32 && !config.winrt && tests.uxtheme",
+ "condition": "features.style-windows && config.win32 && !config.winrt",
"output": [ "styles" ]
},
"style-windowsvista": {
ビルドスクリプトにこのようなパッチが見当たらないため、MSYS2パッケージがうまく機能した理由がわかりません。
Qt5.9.1からQt5.12にアップグレードした後、同じ問題が発生しました。
Qwindows\5.12.0\msvc2017_64\plugins\stylesにあるqwindowsvistastyle.dllを配置するには、applicationDir\stylesディレクトリに配置する必要がありました。
QtベースのGUIは、OSに応じてデフォルトのテーマを自動的に選択します。オーバーライドしたい場合は、QApplicationの setStyle
メソッドを探します。これにより、アプリケーションで使用するスタイルに関係なく、アプリケーションで使用するスタイルを定義できます。
_QApplication::setStyle("fusion");
_
ドキュメントから、以下がサポートされています。
サポートされるテーマはプラットフォームによって異なり、プラグインで拡張できます。
編集:この回答は、OSがQt構成手順で正しく検出され、使用するテーマを変更したい状況を対象としています。説明されている状況では、誤ったテーマが選択されましたが、OPの回答で修正されています。
GUIがウィジェットではなくQtQuickに基づいている場合は、代わりにQQuickStyle::setStyle("Material");
を使用して、使用したいテーマをカスタマイズできます。
詳細については、そのドキュメントページをご覧ください。
静的Qt 5.6.3から静的5.12.0にアップグレードするときにも同じ問題が発生しました。 QApplication :: setStyle()を使用して「windowsvista」スタイルを手動で設定しようとしたところ、デバッグ時に解決されました。 5.12.0では、windowsvistaスタイルは独自の独立したプラグインであり、plugins/styles/qwindowsvistastyle.libにリンクし、メイン関数を含むcppファイルにQ_IMPORT_PLUGIN(QWindowsVistaStylePlugin)を追加する必要があります。その後、スタイルを手動で設定する必要はなく、自動的に選択されます。