如何指示 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 设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PySide2 实现响应式画廊视图

如何断开 PySide2 中的按钮单击信号?

如何正确退出 Pyside2 多线程 GUI 应用程序?

如何打包 PySide2 应用程序以进行分发?

如何从具有 PySide2 GUI 的 python 脚本构建一个 mac os 应用程序?

如何在 PySide2 中正确使用 CSS