Отображение SVG в качестве фона QMainWindow в Pyside 2 - PullRequest
0 голосов
/ 07 сентября 2018

Раньше мне было трудно установить SVG в качестве фона, когда я использовал простой QWidget в качестве основного окна. Как предложил другой пользователь SO , я перегрузил метод paintEvent() в QWidget и смог успешно отобразить фон 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

1 Ответ

0 голосов
/ 07 сентября 2018

Проблема в селекторе в таблице стилей, в вашем случае у вас есть:

CustomWidget#Form{...}

В нем вы указываете, что этим свойствам будет присвоено значение CustomWidget, имя объекта которого равно Form, но в вашем случае имя объекта CustomWidget - centralwidget, поэтому решение должно измениться на:

CustomWidget#centralwidget{...}

enter image description here

Я рекомендую вам проверить:

...