LINUX.ORG.RU

Удаление виджета в PyQt5

 , ,


1

2

Допустим, есть QVBoxLayout, в который динамически добавляются кнопки:

labels = ['Button 1', 'Button 2', 'Button 3']
for label in labels:
    button = QPushButton(label)
    self.vbox.addWidget(button)

Это происходит внутри метода класса и по идее все переменные локальные, так что должны уничтожиться после выхода из него (если сделать button = None в конце, то ничего не меняется).

А затем в какой-то момент времени мы хотим удалить эти кнопки:

while self.target_buttonbox.takeAt(0):
    pass

В результате данного цикла кнопки удаляются лишь из layout'а, но не сами объекты. Это выглядит как видимые кнопки, которые больше не подчиняются layout. Если же делать не просто takeAt, а вызывать deleteLater к полученному takeAt виджету, то приложение крашится.

Как правильно удалить все виджеты окончательно?

★★★★★

Последнее исправление: KivApple (всего исправлений: 2)
if ( m_view->layout() != NULL )
{
    QLayoutItem* item;
    while ( ( item = m_view->layout()->takeAt( 0 ) ) != NULL )
    {
        delete item->widget();
        delete item;
    }
    delete m_view->layout();
}
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

takeAt возвращает QLayoutItem. Не запускал:

while self.target_buttonbox.count():
    item = self.target_buttonbox.takeAt(0)
    widget = item.widget()
    if widget is not None:
        widget.deleteLater()

fluorite ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.