当我使用简单的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_())
问题是样式表中的选择器,在您的情况下,您有:
CustomWidget#Form{...}
在其中,您指示这些属性将设置为其对象名为Form的CustomWidget,但在您的情况下,CustomWidget对象名是centralwidget,因此解决方案是更改为:
CustomWidget#centralwidget{...}
我建议你查一下: