如何从资源中添加 .qss 文件

Posted

技术标签:

【中文标题】如何从资源中添加 .qss 文件【英文标题】:How to add a .qss file from resource 【发布时间】:2016-07-27 10:02:21 【问题描述】:

我的问题如下: 我正在使用 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"))

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

如前所述,如果没有解码,我只会得到“无法解析应用程序样式表”-错误。我的样式表只包含#ALL_ASCII_NAME color:red。应该都是ascii。也许真的需要一个样式表还不够花哨,但我真的很想知道它是如何工作的。 @haxor789。抱歉,我本可以发誓这有效,这就是为什么我错过了你问题的那一部分。无论如何,我已经用不同的解决方案更新了我的答案,它应该可以正常工作。

以上是关于如何从资源中添加 .qss 文件的主要内容,如果未能解决你的问题,请参考以下文章

3018/3/16-工作总结

qrc资源文件加载后,裸机环境下图片不显示

QFile.open 无法打开资源 qrc 中的文件

[PYQT]QSS使用,附自己的模板(算是扒OSX UI)

如何从 Bundle 中获取 PNG 文件的资源路径?

如何从资源播放音频