如何为PyQt5应用程序修复主题?

5

我曾在同一系统上尝试使用pip和apt(python3-pyqt5)安装PyQt5,但两个版本的主题不同(以下是图片)。

我尝试将环境变量QT_STYLE_OVERRIDE设置为"gtk"或"gtk+",但无法获得本机外观。

我很好奇这是为什么。如何强制使用QGtkStyle?其他本地应用程序,如Clementine、VLC、Zeal都可以使用QGtkStyle主题,并根据gnome-shell主题进行混合。

按照一些在线说明,我尝试了qt5-style-plugins,但没有gtk主题。

从pip中安装(QFusionStyle):

installed from pip

从apt安装(QGtkStyle):

installed from apt


尝试将DESKTOP_SESSION设置为gtk。 - Oliver
没有起作用。在这两种情况下,QT_QPA_PLATFORMTHEME 都是相同的 "appmenu-qt5",而 DESKTOP_SESSION 是 "ubuntu"。 - Himanshu Shekhar
@HimanshuShekhar。你说“这两个版本的主题不同”-但是不同于什么任何一个是否符合您的预期?还是有其他样式您没有告诉我们?请展示一张具有您期望的样式的“正常”Qt应用程序(即非PyQt5应用程序)的屏幕截图。 - ekhumoro
1
@HimanshuShekhar。通过 pip 安装的 PyQt5 将使用一个 wheel,其中包含了它自己的 Qt5 副本。这意味着它无法访问您系统中通常存在的 Qt5 插件。第一张截图中展示的样式是默认的 "fusion" 部件样式。 - ekhumoro
@ekhumoro 我没有预料到融合小部件风格。我期望的是第二个,它与Ubuntu上的所有其他应用程序相同。 - Himanshu Shekhar
1个回答

2

这段评论有点长,以下是一些尝试方法:

  • 设置DESKTOP_SESSION(在您的情况下没有帮助)
  • 打印QApplication.style().metaObject().className(),查看两次运行是否相同。风格对象上可能有其他有用的属性。
  • 打印QStyleFactory.keys(),QT_STYLE_OVERRIDE必须是打印值之一。
  • 参考Qt和GTK应用的统一外观
  • --style选项会覆盖QT_STYLE_OVERRIDE设置
  • 一个安装中可能会激活插件风格

第一个样式().metaObject().className()的结果是QFusionStyle,第二个是QGtkStyle。如果我尝试通过“style”参数传递任何字符串,它会导致QWindowsStyle。如何强制使用QGtkStyle?我正在寻找一些方法,使更改gnome-shell主题对应用程序也有效。Clementine、VLC就是这样工作的。我在这里寻找同样的方法。帮助将不胜感激。谢谢。 - Himanshu Shekhar
@HimanshuShekhar。我已经解释了为什么使用pip安装时会获得默认的fusion样式。您需要将所需的样式插件添加到通过wheel安装的Qt5的副本中。 - ekhumoro
此外,使用 pip 版本的 gtk2 风格会导致系统冻结。看起来 pyqt 5.7 放弃了 gtk 主题支持。apt 版本可能已经针对此进行了调整。 - Himanshu Shekhar
@HimanshuShekhar。如果你的系统其余部分没有使用gtk2风格插件,为什么要使用它呢?我以为你想让所有东西看起来都一样?大概,Ubuntu主要基于gtk3,它不使用风格插件(全部基于CSS)。 - ekhumoro
@ekhumoro 因为我尝试了 gtk3,但它看起来很糟糕。应用程序看起来像是放大了两倍。使用 gtk3 样式,它实现了 QCleanlooksStyle - Himanshu Shekhar
@HimanshuShekhar。看起来如果你想要gtk2插件,就必须为pip安装的Qt5编译qtstyleplugins - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接