如何从资源添加 .qss 文件

How to add a .qss file from resource

我的问题如下: 我正在使用 PyQt5,我想使用外部样式表,这意味着我有一个在我的 .qrc 文件中引用的 .qss,我想在我的代码中应用它。

现在我的问题是我将如何加载这个文件以及它需要什么格式。例如

sty_f = open(":/Style/style.qss","r")

导致 FileNotFound 错误。虽然根据资源文件它应该在那里。

sty_f = QtCore.QFile(":/Style/style.qss")
sty_f.open(QtCore.QIODevice.ReadOnly)
另一方面,

可以毫无问题地找到引用的文件,但会生成 APP.setStyleSheet(sty_f.readAll()) 无法使用的 QByteArray。仅将其转换为 str APP.setStyleSheet(str(sty_f.readAll())) 会导致 Could not parse application stylesheet 错误。

最后但同样重要的是:

sty_f = open("PATH/style.qss","r")
APP.setStyleSheet(sty_f.read())

有效。现在有没有办法让它也使用资源文件工作?哪些部分可能存在缺陷,因为它们都起作用但不是同时起作用?

更新:同样有效的是:

sty_f = QtCore.QFile(":/Style/style.qss")
sty_f.open(QtCore.QIODevice.ReadOnly)
APP.setStyleSheet(((sty_f.readAll()).data()).decode("latin1"))

但问题是是否有更好的方法来做到这一点,因为转换这种混乱感觉并不是最佳解决方案。

部分Qt API支持直接读取资源,否则需要自己阅读。这也需要使用 Qt IO 类,因为这些是唯一可以理解资源路径的东西。

对于读取 qss 文件的特定情况,您可以忽略编码,因为该文件应该只包含 ascii。所以这看起来很简单,你可以得到:

stream = QtCore.QFile(resource_path)
stream.open(QtCore.QIODevice.ReadOnly)
widget.setStyleSheet(QtCore.QTextStream(stream).readAll())