Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyQt5/Pyside2将重复的SVG模式设置为主窗口/Qwidget背景_Python_Svg_Pyqt5_Qtstylesheets_Pyside2 - Fatal编程技术网

Python 使用PyQt5/Pyside2将重复的SVG模式设置为主窗口/Qwidget背景

Python 使用PyQt5/Pyside2将重复的SVG模式设置为主窗口/Qwidget背景,python,svg,pyqt5,qtstylesheets,pyside2,Python,Svg,Pyqt5,Qtstylesheets,Pyside2,我已经通过生成了SVG css代码,并试图将其用作我的主窗口/Qwidget的背景。我希望背景随着窗口变大或缩小而调整大小。我尝试调用Form.setStyleSheet(),并将生成的css作为参数传入,但我只得到模式中两种颜色中的一种(背景色)。将SVG显示为QWidget主窗口的背面并查看完整模式的正确方式是什么?我知道SVG是存在的,但是,我不确定一旦我创建了QSvgRenderer对象,我将从那里开始,使SVG成为一个可调整大小的背景。我被告知使用背景重复:重复属性没有改变任何内容 下

我已经通过生成了SVG css代码,并试图将其用作我的主窗口/Qwidget的背景。我希望背景随着窗口变大或缩小而调整大小。我尝试调用Form.setStyleSheet(),并将生成的css作为参数传入,但我只得到模式中两种颜色中的一种(背景色)。将SVG显示为QWidget主窗口的背面并查看完整模式的正确方式是什么?我知道SVG是存在的,但是,我不确定一旦我创建了QSvgRenderer对象,我将从那里开始,使SVG成为一个可调整大小的背景。我被告知使用背景重复:重复属性没有改变任何内容

下面是我写的一个最小、完整且可验证的示例:

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout_2.addLayout(self.horizontalLayout)
        self.retranslateUi(Form)
        Form.setStyleSheet("""background-repeat: repeat; background-color: #000000;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg id='hexagons' fill='%23b0b0b0' fill-opacity='0.4' fill-rule='nonzero'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");""")
        QtCore.QMetaObject.connectSlotsByName(Form)

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


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
表单当前的外观:

表格的外观:

SVG模式的XML表示

<svg xmlns="http://www.w3.org/2000/svg" width="28" height="49" viewBox="0 0 28 49"><g fill-rule="evenodd"><g id="hexagons" fill="#000" fill-rule="nonzero"><path d="M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z"/></g></g></svg>

正在更改的按钮背景示例:

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout_2.addLayout(self.horizontalLayout)

        self.Start_Stop_button = QtWidgets.QPushButton(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.Start_Stop_button.sizePolicy().hasHeightForWidth())
        self.Start_Stop_button.setSizePolicy(sizePolicy)
        self.Start_Stop_button.setMinimumSize(QtCore.QSize(0, 0))
        self.Start_Stop_button.setBaseSize(QtCore.QSize(0, 0))
        self.Start_Stop_button.setIconSize(QtCore.QSize(16, 16))
        self.Start_Stop_button.setFlat(False)
        self.Start_Stop_button.setObjectName("Start_Stop_button")
        contents = b"<svg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'><g fill-rule='evenodd'><g id='hexagons' fill='#b0b0b0' fill-opacity='0.4' fill-rule='nonzero'><path d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/></g></g></svg>"
        file = QtCore.QTemporaryFile(Form)
        if file.open():
            file.write(contents)
            file.flush()
            Form.setStyleSheet("""background-color: #000000;
                                  background-image: url(%s);""" % file.fileName())

        #Form.show()
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Form", None, -1))
        self.Start_Stop_button.setText(QtWidgets.QApplication.translate("Form", "Start", None, -1))

class Widget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.setupUi(self)

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

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
从PySide2导入QtCore、QtGui、QtWidgets
类Ui_表单(对象):
def setupUi(自我,表格):
Form.setObjectName(“表单”)
表单。调整大小(400300)
self.horizontalLayout_2=qtwidts.QHBoxLayout(表单)
self.horizontalLayout_2.setObjectName(“horizontalLayout_2”)
self.horizontalLayout=qtwidts.QHBoxLayout()
self.horizontalLayout.setObjectName(“horizontalLayout”)
self.horizontalLayout_2.addLayout(self.horizontalLayout)
self.Start\u Stop\u button=qtwidts.QPushButton(表单)
sizePolicy=qtwidts.QSizePolicy(qtwidts.QSizePolicy.Minimum,qtwidts.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.Start\u Stop\u按钮。sizePolicy().hasHeightForWidth())
self.Start\u Stop\u按钮。设置大小策略(sizePolicy)
self.Start\u Stop\u按钮.setMinimumSize(QtCore.QSize(0,0))
self.Start\u Stop\u按钮.setBaseSize(QtCore.QSize(0,0))
self.Start\u Stop\u button.setIconSize(QtCore.QSize(16,16))
自启动\停止\按钮设置平坦(假)
self.Start\u Stop\u button.setObjectName(“Start\u Stop\u button”)
内容=b“”
file=QtCore.QTemporaryFile(表单)
如果文件为.open():
file.write(目录)
file.flush()文件
Form.setStyleSheet(““”背景色:#000000;
背景图像:url(%s);“”%file.fileName()
#表格.show()
自重传(表格)
QtCore.QMetaObject.connectSlotsByName(表单)
def重新传输(自身,表格):
setWindowTitle(qtwidts.QApplication.translate(“Form”,“Form”,None,-1))
self.Start\u Stop\u button.setText(qtwidts.QApplication.translate(“Form”,“Start”,None,-1))
类小部件(QtWidgets.QWidget,Ui_表单):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setupUi(self)
def paintEvent(自身,事件):
opt=qtwidts.QStyleOption()
opt.init(self)
painter=QtGui.QPainter(自)
self.style().drawPrimitive(qtwidts.QStyle.PE_小部件,opt,painter,self)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec_())

QSS不支持此类型的url,解决方法是将内容保存在临时文件中,该文件在应用程序关闭时删除,为此我们使用QTemporaryFile

另一方面,url具有以下格式:
数据:image/svg+xml,
,这是您应该使用的内容

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout_2.addLayout(self.horizontalLayout)
        self.retranslateUi(Form)

        contents = b"<svg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'><g fill-rule='evenodd'><g id='hexagons' fill='#b0b0b0' fill-opacity='0.4' fill-rule='nonzero'><path d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/></g></g></svg>"
        file = QtCore.QTemporaryFile(Form)
        if file.open():
            file.write(contents)
            file.flush()
            Form.setStyleSheet("""background-color: #000000;
                                  background-image: url(%s);""" % file.fileName())
        QtCore.QMetaObject.connectSlotsByName(Form)

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


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

加号:

QSS具有应用以下链接中所示样式的规则:

在您的情况下,为了使其仅适用于当前小部件,您必须使用
objectName


我使用了与您提供的代码完全相同的代码,但我仍然只获得背景,没有前景。我正在使用Pyside2而不是PyQt5,但我不认为这会有什么不同,因为它以前从未有过。我已经用SVG的原始XML表示更新了原始帖子。是否有一种方法可以使用提供的原始XML来显示SVG,这可能与Pyside2一起工作,而不是一种解决方法?@Mrcitrusboots好的,我得到了与您指出的相同的东西,因此您应该以智能的方式使用标记,不要假设PyQt5中的所有内容都在Pyside2中工作,请使用正确的标记。您是否介意将这一行分解:
self.style().drawPrimitive(qtwidts.QStyle.PE_Widget,opt,painter,self)
?@Mrcitrusboots为什么?我不确定为什么需要每个参数,我认为最好理解您自己的程序中使用的逻辑。
from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout_2.addLayout(self.horizontalLayout)
        self.retranslateUi(Form)

        contents = b"<svg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'><g fill-rule='evenodd'><g id='hexagons' fill='#b0b0b0' fill-opacity='0.4' fill-rule='nonzero'><path d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/></g></g></svg>"
        file = QtCore.QTemporaryFile(Form)
        if file.open():
            file.write(contents)
            file.flush()
            Form.setStyleSheet("""background-color: #000000;
                                  background-image: url(%s);""" % file.fileName())

        QtCore.QMetaObject.connectSlotsByName(Form)

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


class Widget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.setupUi(self)

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

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Form.setStyleSheet("""QWidget#Form{background-color: #000000;
                      background-image: url(%s);}""" % file.fileName())