Изображение на фоне для QFrame

Есть ли какой-то адекватный способ поставить изображение на фон QFrame ?

Минимальный код, демонстрирующий проблему:

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.frame = QtWidgets.QFrame()
        self.frame.setMinimumSize(QtCore.QSize(200, 200))
        self.frame.setObjectName("frame")
        self.frame_2 = QtWidgets.QFrame(self.frame)
        self.frame_2.setMaximumSize(QtCore.QSize(100, 100))
        self.frame_2.setObjectName("frame_2")
        self.setCentralWidget(self.frame)


        #self.frame.setStyleSheet("QFrame {background-image: url('wooden_back.png'); border-radius: 15px;}")
        self.frame_2.setStyleSheet("QFrame {background-color: rgb(255, 0, 0);}")
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

у меня получилось добавить изображение используя:

self.frame.setStyleSheet("QFrame {background-image: url('wooden_back.png'); border-radius: 15px;}")

но

  1. Изображение не отображается в Qt Desiner.
  2. Такой способ ломает стили всех дочерних элементов. В смысле все элементы наследуют стиль от родителя, даже если у них явно задан другой стиль.

Вот как выглядит исполнение с и без добавлением изображения на фон:

введите сюда описание изображения

введите сюда описание изображения


Ответы (2 шт):

Автор решения: S. Nick

Я не уверен, что правильно понял то, что вы хотите получить. Пока предложу попробовать следующее:

main.py

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.frame = QtWidgets.QFrame()
        self.frame.setMinimumSize(QtCore.QSize(300, 400))
        self.frame.setObjectName("frame")
        
        self.frame_2 = QtWidgets.QFrame(self.frame)
        self.frame_2.setMaximumSize(QtCore.QSize(200, 100))
        self.frame_2.setObjectName("frame_2")
        
        self.setCentralWidget(self.frame)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.pushButton = QPushButton('Button')
        
        self.gridLayout = QGridLayout(self.frame)
        self.gridLayout.addWidget(self.frame_2, 0, 0)
        self.gridLayout.addWidget(self.pushButton, 1, 0)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#        self.frame.setStyleSheet("QFrame {background-image: url('wooden_back.png'); border-radius: 15px;}")
#        self.frame_2.setStyleSheet("QFrame {background-color: rgb(255, 0, 0);}")


Stylesheet = '''
/* 
vvvvvv   <-------------------------------------------- */  
#frame {
    background-image: url('first.jpg'); 
    border-radius: 4px;
}
/* 
vvvvvvvv   <------------------------------------------ */  
#frame_2 {
    background-color: rgb(255, 0, 0);
    border-image: url(boy33.png) 0 0 0 0 stretch stretch;
    border-radius: 15px;
}
'''

        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(Stylesheet)                                  # +++ 
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

введите сюда описание изображения


first.jpg

введите сюда описание изображения

boy33.png

введите сюда описание изображения

→ Ссылка
Автор решения: Telegram. sawa_0

Избежать наследования можно задав стиль с указанием объекта, на фон которого нужно поставить изображение:

QFrame#frame {
background-image: url('ресурсы/wooden_back.png');
}

Однако, изображение всё ещё не отображается в Qt Desiner

Если есть способ загрузить изображение через Qt Desiner, ответ будет лучше этого.

→ Ссылка