it-swarm.com.ru

Тема Qt GUI выглядит старомодно

Когда я сам кросс-компилирую Qt 5.8.0 из исходного кода и использую его для сборки примера Qt "Dynamic Layouts" из Qt Widgets для Microsoft Windows, он выглядит старомодно, как если бы он работал в Windows 2000, как показано в левом окне ниже. Однако, если я скомпилирую точно такую ​​же программу, используя предварительно собранный пакет mingw-w64-x86_64-qt5-static (версия 5.8.0-1) из MSYS2 , это будет похоже на современное приложение Windows, как показано на рисунке. в правом окне ниже. Как я могу исправить свою версию Qt, чтобы встроенные графические интерфейсы выглядели хорошо? Есть ли опция конфигурации, которую мне не хватает?

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

Одна вещь, на которую стоит обратить внимание, это класс QWindowsVistaStyle. Я заметил, что когда я компилировал свою программу в MSYS2, мне пришлось добавить -luxtheme, потому что этот класс ссылался на некоторые функции оттуда, такие как GetThemeColor. Эти функции доступны только в Windows Vista и более поздних версиях. Когда я кросс-компилировал, используя свой собственный Qt в Linux, мне не понадобилась эта библиотека, поэтому, возможно, этот класс был каким-то образом отключен в моей сборке.

Кросс-скомпилированные детали сборки Qt

Я построил кросс-скомпилированный Qt и старый вид динамических макетов, используя commit f51d834 из моего репозитория nixcrpkgs. Если вы посмотрите на код в этом коммите, он покажет вам, какие именно команды были запущены для сборки кросс-компилятора mingw-w64, сборки Qt и построения примеров Qt, включая Dynamic Layouts. Вы можете создать его самостоятельно, если вы установите Nix , загрузите nixcrkpkgs , а затем запустите nix-build -A pkgs.i686-w64-mingw32.qt.base-examples в каталоге nixcrpkgs. Вы можете увидеть мой рецепт сборки пакета Qt в этом коммите .

Детали сборки MSYS2

Я запустил этот скрипт в оболочке MINGW64 в MSYS2, чтобы построить пример и получил хорошие результаты. Он основан на пакете mingw-w64-x86_64-qt5-static от MSYS2. Вы можете увидеть построить рецепт для этого пакета .

9
David Grayson

Если вы посмотрите на файл src/widgets/configure.json из Qt 5.8.0, вы увидите, что он проверяет существование uxtheme.h и что uxtheme.h является предварительным условием для компиляции стиля windowsxp, который является предварительным условием для компиляции стиля windowsvista. Просматривая config.log в Qt, я увидел, что тест uxtheme.h не прошел. Я не уверен почему, но это, вероятно, потому что uxtheme.h не может быть включен сам по себе; Вы должны включить windows.h заранее. Я проверил, что стили windowsxp и windowsvista действительно не были включены, просмотрев файл src/widgets/qtwidgets-config.pri после настройки Qt. У него есть список стилей, которые будут скомпилированы, и windowsvista это не список.

Я попытался добавить параметры -style-windowsxp -style-windowsvista в команду configure Qt, но эти параметры просто вызывают ошибки, потому что тест 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

Приложение Qt автоматически выберет тему по умолчанию в зависимости от вашей ОС. Если вы хотите переопределить их, вы ищете метод setStyle QApplication, который позволяет вам определять стиль, используемый для вашего приложения, независимо от того, на какой ОС он работает.

QApplication::setStyle("fusion");

Из документации поддерживаются следующие:

  • «окно»
  • «Слитый»
  • "Windows XP"
  • "Macintosh"

Правка: Этот ответ нацелен на ситуации, когда операционная система правильно обнаруживает шаг конфигурации Qt, и вы просто хотите изменить используемую тему. В описанной ситуации была выбрана неправильная тема, которая фиксируется в ответе ОП.

6
Adrien Leravat

У меня была такая же проблема при обновлении со статического Qt 5.6.3 до статического 5.12.0. Я решил это после того, как попытался вручную установить стиль "windowsvista" с помощью QApplication :: setStyle () и заметил, что он возвращает ноль при отладке. Оказывается, в 5.12.0 стиль windowsvista - это отдельный отдельный плагин, и вам нужно связать его с plugins/styles/qwindowsvistastyle.lib и добавить Q_IMPORT_PLUGIN (QWindowsVistaStylePlugin) в файл cpp, содержащий вашу основную функцию. После этого нет необходимости вручную устанавливать стиль, он выбирается автоматически.

0
Steve Rogers

У меня была такая же проблема после обновления с Qt5.9.1 до Qt5.12. 

Размещение файла qwindowsvistastyle.dll, который я обнаружил в Qt\5.12.0\msvc2017_64\plugins\styles, нужно было поместить в мой каталог applicationDir\styles.

0
Jonathan Owens