Как указать приложению PySide2 использовать настройки qt5ct?

Я экспериментирую с очень простыми примерами руководств по PySide2 и заметил, что стиль и размер шрифта сильно отличаются от стиля «обычных» приложений Qt.

Я использую qt5ct в Linux Mint 18, но приложение PySide2 игнорирует настройки:

введите описание изображения здесь

Приложение очень простое:

import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QFile, Qt

if __name__ == "__main__":
    app = QApplication(sys.argv)
    file = QFile("mainwindow.ui")
    file.open(QFile.ReadOnly)
    loader = QUiLoader()
    window = loader.load(file)
    window.show()
    sys.exit(app.exec_())

Есть ли способ указать ему использовать настройки qt5ct? Google не дает ничего полезного, поэтому любые подсказки приветствуются!


person yesint    schedule 20.09.2018    source источник
comment
Я также получаю это предупреждение при запуске приложения: Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute Я не уверен, связано ли это с невозможностью получить правильный стиль.   -  person yesint    schedule 21.09.2018
comment
К сожалению, у меня нет решения этой проблемы, но у меня есть потенциальный намек на поиск решения. На рабочем столе Plasma установленные pip версии PyQt5 и PySide2 используют системный стиль, шрифт и значки. Следовательно, Plasma должна что-то делать, чтобы заставить их соблюдать системные настройки. Проблема в том, что при попытке найти информацию о том, что это может быть, все, что вы можете найти, это совет QT_QPA_PLATFORMTHEME = qt5ct или QT_QPA_PLATFORMTHEME = kde, который не работает для версий PyQt5 и PySide2, не установленных диспетчером пакетов.   -  person Abe Stewart    schedule 07.04.2019


Ответы (2)


Побывал здесь несколько раз и в конце концов нашел собственное решение.

См. https://bugreports.qt.io/browse/PYSIDE-842.

Эта проблема возникает, когда ваш pyside2 был установлен через pip, но ваш Qt был установлен системой (в моем случае Manjaro / Arch).

Вот что я получил при использовании pip-версии pyside2:

>>> from PySide2.QtWidgets import QStyleFactory
>>> print(QStyleFactory.keys())

[u'Windows', u'Fusion']

При использовании pyside2, упакованного Arch Linux, я получаю:

>>> from PySide2.QtWidgets import QStyleFactory
>>> print(QStyleFactory.keys())

['Adwaita-Dark', 'Adwaita', 'Breeze', 'bb10dark', 'bb10bright', 'kvantum-dark', 'kvantum', 'cleanlooks', 'gtk2', 'cde', 'motif', 'plastique', 'qt5ct-style', 'Oxygen', 'Windows', 'Fusion']

Использование пакета pyside2, поставляемого с моей системой, вместо этого (sudo pacman -S pyside2) решило эту проблему для меня. В моем приложении pyside2 теперь используется системная тема Qt.

person Steve Pryde    schedule 06.01.2019
comment
Что ж, есть две проблемы. Во-первых, в дистрибутивах на основе Debian (Ubuntu, Mint) pyside2 не упакован, поэтому его можно было установить только из pip. Во-вторых, я до сих пор не вижу никакой логики: в системе всего один набор библиотек Qt, так почему источник установки pyside2 должен иметь значение? - person yesint; 07.01.2019
comment
Источник реализации pyside2 имеет значение из-за библиотек Qt, с которыми он был связан при сборке, и любых флагов, которые были установлены в то время. Не похоже, что pyside2 будет использовать ваши системные библиотеки Qt, если он был установлен через pip (установка pip, похоже, включает предварительные зависимости qt, что означает, что он не будет использовать ваши системные). На pypi.org/project/PySide2 есть документация по созданию pyside2 из исходного кода, которая может помочь - person Steve Pryde; 07.03.2020

Чтобы все ваши приложения использовали qt5ct, вы должны установить QT_QPA_PLATFORMTHEME = "qt5ct" в качестве переменной вашего сеанса или системы, например, в ~/.xprofile:

[ "$XDG_CURRENT_DESKTOP" = "KDE" ] || [ "$XDG_CURRENT_DESKTOP" = "GNOME" ] || export QT_QPA_PLATFORMTHEME="qt5ct"

Если вы хотите, чтобы вас установили только в своем приложении, вы должны передать это через командную строку:

python /path/of/your/script.py --platformtheme qt5ct

Или лучше добавить по коду:

import sys
from PySide2 import QtCore, QtWidgets, QtUiTools


if __name__ == "__main__":
    sys.argv.extend(["--platformtheme", "qt5ct"]) 
    app = QtWidgets.QApplication(sys.argv)
    file = QtCore.QFile("mainwindow.ui")
    file.open(QtCore.QFile.ReadOnly)
    loader = QtUiTools.QUiLoader()
    window = loader.load(file)
    window.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 20.09.2018
comment
Это вообще не имеет никакого эффекта. Добавление этого флага ничего не меняет. У меня export QT_QPA_PLATFORMTHEME="qt5ct" в моем .profile, и все другие приложения qt5 на моем компьютере работают правильно и используют тему qt5ct. - person yesint; 21.09.2018
comment
как странно, тот флаг, который я использую в archlinux. - person eyllanesc; 21.09.2018
comment
@yesint Вы использовали последний метод: sys.argv.extend(["--platformtheme", "qt5ct"])? - person eyllanesc; 21.09.2018
comment
да. Это не работает. Сам флаг работает - все другие приложения его успешно используют, но не приложения PySide. Понятия не имею, что случилось. - person yesint; 22.09.2018