Как обновить содержимое QScrollArea?

Есть QScrollArea, содержащий какой-то QWidget с содержимым:

def initUI(self):
   w = QWidget()
   self.scroll = QScrollArea()
   self.scroll.setWidget(w)

Как можно, например, по нажатию на кнопку обновить содержимое self.scroll?

import sys
from PyQt5.Qt import *


class Demo(QWidget):    
    def __init__(self):        
        super().__init__()

        self.vbox = QVBoxLayout(self)

        self.button = QPushButton(f'Обновить')
        self.button.clicked.connect(self.updateScroll)            
        self.vbox.addWidget(self.button)          

        self.w = QWidget()        
        self.scroll = QScrollArea()
        self.scroll.setObjectName("ScrolledArea")
        self.scroll.setStyleSheet("#ScrolledArea {\n"
                                  "     border: none;\n"
                                  "}\n")
        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll.setWidgetResizable(True)
        self.scroll.setWidget(self.w)
        self.vbox.addWidget(self.scroll)


    def updateScroll(self):
        self.w2 = QWidget()
        print("Обновить содержимое self.scroll на self.w2")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Demo()
    w.show()
    app.exec_()

Чтобы очистить содержимое Layout перед добавлением можно применить:

Demo.clearLayout(self.vbox2)

def clearLayout(layout):
  while layout.count():
    child = layout.takeAt(0)
    if child.widget():
      child.widget().deleteLater()

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

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

Попробуйте так:

import sys
from PyQt5.Qt import *


class Demo(QWidget):    
    def __init__(self):        
        super().__init__()

        self.vbox = QVBoxLayout(self)

        self.button = QPushButton(f'Обновить')
        self.button.clicked.connect(self.updateScroll)            
        self.vbox.addWidget(self.button)          

        self.w = QWidget()  
        self.vbox2 = QVBoxLayout(self.w)                                
        self.label = QLabel('Hello World')
        self.vbox2.addWidget(self.label)

        self.scroll = QScrollArea()
        self.scroll.setObjectName("ScrolledArea")
        self.scroll.setStyleSheet("#ScrolledArea {\n"
                                  "     border: none;\n"
                                  "}\n")
        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll.setWidgetResizable(True)
        self.scroll.setWidget(self.w)
        self.vbox.addWidget(self.scroll)

    def updateScroll(self):
        self.label.hide()
        self.w2 = QWidget()
        label = QLabel('Hello PyQt5')
        vbox = QVBoxLayout(self.w2)
        vbox.addWidget(label)
        label2 = QLabel()
        label2.setPixmap(QPixmap('Ok.png'))
        vbox.addWidget(label2)

        print("Обновить содержимое self.scroll на self.w2")
        self.vbox2.addWidget(self.w2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Demo()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка