在 Pyside2 中将 SVG 显示为主窗口的背景

Displaying SVG as backround of QMainWindow in Pyside 2

我以前在使用简单的 QWidget 作为主要 window 时,很难将 SVG 设置为背景。 ,我重载了QWidget的paintEvent()方法,能够成功显示SVG背景。

但是,我现在正在开发另一个需要 QStatusbar 的应用程序,因此我使用 QMainWindow 作为主要 window 而不是 QWidget。我尝试了重载 paintEvent() 方法的相同方法,但无济于事。这很令人费解,因为所有 QMainWindows 拥有的中央小部件只是一个 QWidget。因此,在 QSS 中指定我想让 SVG 成为中央小部件的背景应该不是问题。这是一个最小的、完整的和可验证的示例以及我得到的 QMainWindow 的屏幕截图。

from PySide2 import QtCore, QtGui, QtWidgets

class CustomWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(CustomWidget, self).__init__(parent)

    def paintEvent(self, event):

        opt = QtWidgets.QStyleOption()
        opt.init(self)
        painter = QtGui.QPainter(self)
        self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget, opt, painter, self)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)



        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.centralwidget = CustomWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        contents = b"<svg width='44' height='12' viewBox='0 0 44 12' xmlns='http://www.w3.org/2000/svg'><path d='M20 12v-2L0 0v10l4 2h16zm18 0l4-2V0L22 10v2h16zM20 0v8L4 0h16zm18 0L22 8V0h16z' fill='#2c2c2c' fill-opacity='0.4' fill-rule='evenodd'/></svg>"
        file = QtCore.QTemporaryFile(self.centralwidget)
        if file.open():
            file.write(contents)
            file.flush()
            self.centralwidget.setStyleSheet("""CustomWidget#Form{background-color: #000000;
                                  background-image: url(%s);}""" % file.fileName())
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

问题是样式表中的选择器,在您的情况下:

CustomWidget#Form{...}

其中你表示这些属性将被设置为对象名为Form的CustomWidget,但在你的情况下CustomWidget对象名为centralwidget,所以解决方案是更改为:

CustomWidget#centralwidget{...}

我建议您查看: