我的 .qss 文件无法应用于我的 .ui 文件 [重复]
Posted
技术标签:
【中文标题】我的 .qss 文件无法应用于我的 .ui 文件 [重复]【英文标题】:my .qss file cannot be applied to my .ui file [duplicate] 【发布时间】:2021-02-15 04:01:51 【问题描述】:我有一个用 Qt Designer 制作的.ui
文件。很简单,只有一个QWidget和一个QLabel,没有任何Qt Style Sheet代码
我还有一个只有一行的.qss
文件:
background: rgb(39, 44, 54);
我想将它们组合在一起,这是我的代码:
# This is a "demo" of the file path.
# and I'm 100% sure that the original path is working.
UI_FILE = "untitled2.ui"
QSS_FILE = "test.qss"
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
"""
load UI file and QSS file
"""
ui_file = QFile(UI_FILE)
ui_file.open(QFile.ReadOnly)
loader = QUiLoader()
self.ui = loader.load(ui_file, parentWidget=self)
ui_file.close()
style_file = QFile(QSS_FILE)
style_file.open(QFile.ReadOnly)
styleSheet = str(style_file.readAll())
self.setStyleSheet(styleSheet)
style_file.close()
""" this button and text edit are used to
confirm whether qss is loaded.
"""
bt = QPushButton("show style sheet")
bt.clicked.connect(self.show_sheet)
self.te = QTextEdit()
self.te2 = QTextEdit()
main_layout = QVBoxLayout(self)
main_layout.addWidget(self.ui)
main_layout.addWidget(bt)
main_layout.addWidget(self.te)
main_layout.addWidget(self.te2)
def show_sheet(self, clicked):
self_ss = self.styleSheet()
self.te.setText(self_ss)
ui_ss = self.ui.styleSheet()
self.te2.setText(ui_ss)
## run
if __name__ == '__main__':
if not QApplication.instance():
app = QApplication(sys.argv)
else:
app = QApplication.instance()
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
这是我的结果:
Qt 样式表不起作用,但是当我单击“显示样式表”时,我可以看到 .qss
已加载。
我试着把qss代码改成这个,但是没用。
QWidget
background: rgb(39, 44, 54);
我尝试使用this code 自定义paintEvent()
,但它也不起作用。
理论上,只要我在顶层设置样式表,下面的控件就会继承。但似乎并非如此。
更新:.ui 文件
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>352</width>
<height>218</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>18</pointsize>
</font>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
【问题讨论】:
.ui文件不是纯文本吗?您不能将其粘贴到您的问题中吗? @SuperStormer 我更新了.ui文件的代码。 显示的文本显示为带有原始前缀、引号和转义符的字符串表示这一事实应该是一个明确的提示。QFile.readAll()
返回一个 QByteArray,你不能仅仅使用 str
来转换它。您要么使用标准的 python 文件访问,要么使用bytearray(data).decode()
进行转换。
@g2m.agent 一个问题是重复的并不意味着他们会消除它(请注意,谁回答,我的意思是,是谁关闭了你的帖子作为重复)。重复只表示问题类似,仅此而已。这并不表示您的帖子不好或应该将其删除。在 SO 中,只有没有任何贡献的重复项被消除,而您的贡献则不会应用格式错误的 qss
【参考方案1】:
问题是因为你错误地将 readAll() 返回的 QByteArray 转换为字符串,你不应该使用 str。
当您使用str(style_file.readAll())
时,您会得到"b'background-color: red'"
而不是"background-color: red"
。
要转换为字符串,有以下选项:
styleSheet = style_file.readAll().data().decode("utf-8")
或
ba = style_file.readAll()
codec = QTextCodec.codecForName("UTF-8")
styleSheet = codec.toUnicode(ba)
输出:
【讨论】:
你完全正确!我从来没有这样想。以上是关于我的 .qss 文件无法应用于我的 .ui 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
内存使用、cpu 时间、数据输出和文件系统存储如何应用于我的网站?