在Pyside 2中将SVG显示为QMainWindow的背景

问题描述 投票:1回答:1

当我使用简单的QWidget作为我的主窗口时,我以前很难将SVG设置为背景。 As suggested by another SO user,我重载了QWidget的paintEvent()方法,并且能够成功显示SVG背景。

但是,我现在正在开发一个需要QStatusbar的不同应用程序,因此我使用QMainWindow作为主窗口而不是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_())

enter image description here

python svg qtstylesheets pyside2
1个回答
1
投票

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

CustomWidget#Form{...}

在其中,您指示这些属性将设置为其对象名为Form的CustomWidget,但在您的情况下,CustomWidget对象名是centralwidget,因此解决方案是更改为:

CustomWidget#centralwidget{...}

enter image description here

我建议你查一下:

© www.soinside.com 2019 - 2024. All rights reserved.