如何从资源添加 .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())
我的问题如下: 我正在使用 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())