如何指示 PySide2 应用程序使用 qt5ct 设置?
Posted
技术标签:
【中文标题】如何指示 PySide2 应用程序使用 qt5ct 设置?【英文标题】:How to instruct PySide2 application to use qt5ct settings? 【发布时间】:2018-09-20 13:36:58 【问题描述】:我正在尝试非常简单的 PySide2 教程示例,并注意到样式和字体大小与“普通”Qt 应用程序的样式有很大不同。
我在 Linux Mint 18 中使用 qt5ct,但 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 设置?谷歌没有提供任何有用的信息,所以任何提示都非常感谢!
【问题讨论】:
我在运行应用程序时也收到此警告:Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute
我不确定这是否与无法获得正确的样式有关。
不幸的是,我没有解决这个问题的方法,但我有可能找到解决方案的提示。在 Plasma 桌面上,pip 安装的 PyQt5 和 PySide2 版本使用系统样式、字体和图标。因此,Plasma 必须做一些事情来让他们尊重系统设置。问题是,当您尝试查找有关您可以找到的所有信息时,QT_QPA_PLATFORMTHEME = "qt5ct" 或 QT_QPA_PLATFORMTHEME = "kde" 建议不适用于非包管理器安装的 PyQt5 和 PySide2 版本。
【参考方案1】:
在这里找到了几次,最终找到了自己的解决方案。
见https://bugreports.qt.io/browse/PYSIDE-842
当您的 pyside2 是通过 pip 安装但您的 Qt 是由系统安装(在我的情况下为 Manjaro/Arch)时,似乎会发生此问题。
这是我在使用pyside2的pip版本时得到的:
>>> from PySide2.QtWidgets import QStyleFactory
>>> print(QStyleFactory.keys())
[u'Windows', u'Fusion']
当使用 arch linux 打包的 pyside2 时,我得到:
>>> 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 主题。
【讨论】:
嗯,有两个问题。首先,在基于 Debian 的发行版(Ubuntu、Mint)中,pyside2 没有打包,因此只能从 pip 安装。其次,我仍然看不到任何逻辑:系统中只有一组 Qt 库,那么为什么 pyside2 安装的来源很重要? pyside2 实现的来源很重要,因为它在构建时链接的 Qt 库,以及当时设置的任何标志。如果 pyside2 是通过 pip 安装的,它看起来不会使用您的系统 Qt 库(pip install 似乎包括预构建的 qt 依赖项,这意味着它不会使用您的系统库)。 pypi.org/project/PySide2 有一些文档用于从源代码构建 pyside2,这可能会有所帮助【参考方案2】:为了让您的所有应用程序都使用 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_())
【讨论】:
这完全没有效果。添加此标志不会改变任何内容。我的 .profile 中有export QT_QPA_PLATFORMTHEME="qt5ct"
,我机器上的所有其他 qt5 应用程序都运行正常,并且正在使用 qt5ct 主题。
真奇怪,我在archlinux中使用的那个标志。
@yesint 你用过最后一种方法吗:sys.argv.extend(["--platformtheme", "qt5ct"])
?
是的。这没用。该标志本身有效 - 所有其他应用程序都在愉快地使用它,但不是 PySide 应用程序。我不知道出了什么问题。以上是关于如何指示 PySide2 应用程序使用 qt5ct 设置?的主要内容,如果未能解决你的问题,请参考以下文章