2013-09-05 2 views
0

Я пытаюсь написать менеджер макетов, который способен отображать все добавленные виджеты, фильтровать их или изменять размер некоторых из них. У меня есть подкласс QWidget, который имеет текущий список виджетов, список всех виджетов, prevList виджетов, которые отображаются до последнего изменения. У этого также есть currentGrid (QGridLayout *), который показывает виджеты соответственно и mainLayout, который содержит сетку и некоторые кнопки.SegFault при попытке использовать ненулевой указатель на QGridLayout (Qt)

Если изменение происходит я вызываю функцию UpdateLayout которого резюме выглядит следующим образом: - Наполните prevList из currentGrid - Очистить и удалить mainLayout - Очистить currentGrid - Наполните currentGrid из CurrentList - создавать новые mainLayout - AddButtons - add currentGrid

Когда я добавляю только 1 виджет, он работает очень хорошо. Когда я попытался добавить второй, он дает segfault.

Вот как я очистить mainLayout

if(mainLayout) //clear mainLayout 
{ 
    while(mainLayout->count() > 0) 
     mainLayout->takeAt(0); 
    delete mainLayout; 
} 

Вот следующая строка этого кода и где происходит, выдаёт ошибку сегментации показал на (->).

if(currentGrid) 
{ 
    -->while(currentGrid->count() > 0) 
    { 
     currentGrid->takeAt(0); 
    } 
} 
+0

Не удалять объекты QObject с удалением. Используйте deleteLater(). – Greenflow

+0

Можете ли вы сказать мне, в чем разница? – uLtRaLoVeR

+0

Qt-docs: ** Объект будет удален, когда управление вернется в цикл событий. ** QObjects может иметь «секретный» ресурс. Будь то из-за сигналов/слотов, будь то из-за событий. Например, в вашем случае вы удаляете элемент из макета, содержимое макета перестраивается. Событие может быть опубликовано, так что другие части gui могут действовать соответственно ... но с шумом отправитель удаляется. deleteLater() гарантирует, что объект будет удален, если это безопасно. – Greenflow

ответ

0

Я уверен, currentGrid был удален.

В любом случае, delete mainLayout; меня не любит. Добавить mainLayout = 0; после этого ...

+0

- Заполнить prevList из currentGrid <--- здесь он работает, поэтому не удаляется - Удалить и удалить mainLayout <--- Я использую функцию takeAt, которая возвращает элемент, поэтому не удаляю, когда я удаляю макет, он пуст - Clear currentGrid <--- таким образом, здесь он не удаляется или я действительно совершенно ошибочно – uLtRaLoVeR

+0

, конечно, невозможно узнать без использования * полного * кода. Но - поверьте мне - SIGSEGV означает, что вы удалили объект * point * ... – CapelliC

0

Ваш код неполный, но не имеет смысла постоянно удалять и воссоздавать макеты.

Неправильная «расчистка» макета. Вы хотите:

void clearLayout(QLayout * layout) { 
    while (layout->count() > 0) delete layout->takeAt(0); 
} 
Смежные вопросы