我的 .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 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

内存使用、cpu 时间、数据输出和文件系统存储如何应用于我的网站?

设计模式:需要帮助理解这个概念以及它如何应用于我的项目

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

Chrome不会将我的XSLT样式表应用于我的本地XML文件

如何让 CSS 文件正确应用于我的 PHP/HTML 代码?