Как обновить виджет в окне приложения?
Мой код наполняет контейнер box виджетами QLabel, между которых помещает self.art - изображение с закругленными краями, которое он получает с помощью класса Label. В конец контейнера попадает кнопка btn, которая должна менять картинку в self.art, но я не знаю, как это сделать. Конечно, можно было бы переложить все элементы контейнера снова или использовать QGridLayout, но, может быть, есть другой способ обновить виджет self.art?
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, picture, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.setMaximumSize(150, 150)
self.setMinimumSize(150, 150)
self.radius = 10
self.target = QtGui.QPixmap(self.size())
self.target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(150, 150, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(self.target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(self.target)
def mouseReleaseEvent(self, event):
self.clicked.emit()
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
box = QtWidgets.QVBoxLayout(self)
label1 = QtWidgets.QLabel('Text 1')
box.addWidget(label1)
label2 = QtWidgets.QLabel('Text 2')
box.addWidget(label2)
self.art = Label('picture1') # Изначальное изображение, которое нужно заменить
box.addWidget(self.art)
label3 = QtWidgets.QLabel('Text 3')
box.addWidget(label3)
label4 = QtWidgets.QLabel('Text 4')
box.addWidget(label4)
btn = QtWidgets.QPushButton('Button', clicked = self.remake)
box.addWidget(btn)
def remake(self):
self.art = Label('picture2') # Изображение, на которое нужно заменить текущее изображение
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Я бы отделил код установки картинки в Label от его конструктора в отдельный метод (например setPicture), тогда не нужно будет пересоздавать Label, чтобы поменять картинку.
Пример:
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, picture, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.setMaximumSize(150, 150)
self.setMinimumSize(150, 150)
self.radius = 10
self.setPicture(picture)
def setPicture(self, picture):
target = QtGui.QPixmap(self.size())
target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(
150, 150, QtCore.Qt.KeepAspectRatioByExpanding,
QtCore.Qt.SmoothTransformation
)
painter = QtGui.QPainter(target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(target)
painter.end()
target = None
def mouseReleaseEvent(self, event):
self.clicked.emit()
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
box = QtWidgets.QVBoxLayout(self)
label1 = QtWidgets.QLabel('Text 1')
box.addWidget(label1)
label2 = QtWidgets.QLabel('Text 2')
box.addWidget(label2)
self.art = Label('picture1') # Изначальное изображение, которое нужно заменить
box.addWidget(self.art)
label3 = QtWidgets.QLabel('Text 3')
box.addWidget(label3)
label4 = QtWidgets.QLabel('Text 4')
box.addWidget(label4)
btn = QtWidgets.QPushButton('Button', clicked = self.remake)
box.addWidget(btn)
def remake(self):
self.art.setPicture('picture2') # Изображение, на которое нужно заменить текущее изображение
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())