web-dev-qa-db-ja.com

Qt GUIテーマが古風に見える

自分でソースから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が見栄えよくなるようにするにはどうすればよいですか?不足している構成オプションはありますか?

Left: Qt compiled by me. Right: Qt compiled by MSYS2 project

調べる必要があるのは、QWindowsVistaStyleクラスです。 MSYS2でプログラムをコンパイルしたときに、そのクラスがGetThemeColorのようないくつかの関数を参照しているため、-luxthemeを追加する必要があることに気付きました。これらの機能は、Windows Vista以降でのみ使用できます。 Linux上で自分のQtを使用してクロスコンパイルしたとき、そのライブラリは必要なかったので、おそらくそのクラスがビルドで無効にされた可能性があります。

クロスコンパイルされたQtビルドの詳細

Nixcrpkgsリポジトリの commit f51d834 を使用して、クロスコンパイルされたQtと古い外観の動的レイアウトの例をビルドしました。そのコミットのコードを見ると、mingw-w64クロスコンパイラーのビルド、Qtのビルド、および動的レイアウトを含むQtの例のビルドに実行されたコマンドが正確に表示されます。 Nix をインストールし、ダウンロード nixcrkpkgs をインストールしてからnixcrpkgsディレクトリでnix-build -A pkgs.i686-w64-mingw32.qt.base-examplesを実行すると、自分でビルドできます。あなたは そのコミットでのQtパッケージの私のビルドレシピ を見ることができます。

MSYS2ビルドの詳細

MSYS2のMINGW64シェルで このスクリプト を実行して例をビルドし、良い結果を得ました。 MSYS2のmingw-w64-x86_64-qt5-staticパッケージに依存しています。 そのパッケージのビルドレシピ を確認できます。

17
David Grayson

Qt 5.8.0のsrc/widgets/configure.jsonファイルを見ると、uxtheme.hの存在を確認し、uxtheme.hwindowsxpスタイル。これは、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パッケージがうまく機能した理由がわかりません。

4
David Grayson

Qt5.9.1からQt5.12にアップグレードした後、同じ問題が発生しました。

Qwindows\5.12.0\msvc2017_64\plugins\stylesにあるqwindowsvistastyle.dllを配置するには、applicationDir\stylesディレクトリに配置する必要がありました。

11
Jonathan Owens

ウィジェット

QtベースのGUIは、OSに応じてデフォルトのテーマを自動的に選択します。オーバーライドしたい場合は、QApplicationの setStyle メソッドを探します。これにより、アプリケーションで使用するスタイルに関係なく、アプリケーションで使用するスタイルを定義できます。

_QApplication::setStyle("fusion");
_

ドキュメントから、以下がサポートされています。

  • "ウィンドウズ"
  • "融合"
  • 「windowsxp」
  • "マッキントッシュ"

サポートされるテーマはプラットフォームによって異なり、プラグインで拡張できます。


編集:この回答は、OSがQt構成手順で正しく検出され、使用するテーマを変更したい状況を対象としています。説明されている状況では、誤ったテーマが選択されましたが、OPの回答で修正されています。

Qt Quick

GUIがウィジェットではなくQtQuickに基づいている場合は、代わりにQQuickStyle::setStyle("Material");を使用して、使用したいテーマをカスタマイズできます。

詳細については、そのドキュメントページをご覧ください。

8
Adrien Leravat

静的Qt 5.6.3から静的5.12.0にアップグレードするときにも同じ問題が発生しました。 QApplication :: setStyle()を使用して「windowsvista」スタイルを手動で設定しようとしたところ、デバッグ時に解決されました。 5.12.0では、windowsvistaスタイルは独自の独立したプラグインであり、plugins/styles/qwindowsvistastyle.libにリンクし、メイン関数を含むcppファイルにQ_IMPORT_PLUGIN(QWindowsVistaStylePlugin)を追加する必要があります。その後、スタイルを手動で設定する必要はなく、自動的に選択されます。

2
Steve Rogers