Отображение SVG в качестве фона QMainWindow в Pyside 2
Ранее у меня были трудности с установкой 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_())
1 ответ
Проблема заключается в селекторе в таблице стилей, в вашем случае у вас есть:
CustomWidget#Form{...}
В нем вы указываете, что этим свойствам будет присвоено значение CustomWidget, имя объекта которого равно Form, но в вашем случае имя объекта CustomWidget - centralwidget, поэтому решение должно измениться на:
CustomWidget#centralwidget{...}
Я рекомендую вам проверить: