Вопрос

У меня есть приложение QT, которое использует QPointers, чтобы открыть новые диалоги UI (виджеты). Основное приложение может иметь многочисленные из того же виджета, загруженного разными данными. Проблема у меня есть в удалении и освобождении памяти для каждого виджета. Если я отслеживаю использование программы ОЗУ, каждый раз, когда я нажимаю кнопку, чтобы открыть одну из этих новых виджетов, он увеличивает оперативную память, и когда я закрываю виджет, он, похоже, не освобождает ОЗУ. Я пытался использовать deleteLater и другие решения, но продолжайте попадания в программу.

Какой пример код здесь:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

Это позвонит виджету «ListResvations», который объявлен как QDialog (Не модал). В этом диалоге у меня есть кнопка, чтобы закрыть окно, которое вызывает QWidget::close() Слот.

Я думаю, вопрос в том, как моя главная программа (которая имеет QPointer) Знайте, когда диалог закрыт, а затем освободить диалог и (если возможно) Удалить указатель, чтобы сохранить еще больше памяти ...

Я думал, что вы сможете сделать QConnect() к тому QPointer Объект, но я не могу найти какие-либо сигналы или слоты, которые позволили бы пропустить указатель, гораздо меньше отправлять сигнал после того, как диалоговое окно действительно закрыто и готово к удалению.

Может быть, мне нужна какая-то функция в основной программе, которая принимает общий объект указателя, а затем позвоните в QDialog, что перед вызовом его собственного закрытого слота? В этой функции она пройдет себя быть разрушенным? Просто выбрасываю идеи, которые я пытался реализовать, но не удалось ....

Я не думаю, что могу повторно использовать один и тот же указатель в другом месте, потому что в теории у вас может быть несколько окон открытыми с листовыми ссылками.

Это было полезно?

Решение

Убедитесь, что вы установили Qt::WA_DeleteOnClose Флаг атрибута в вашем диалоговом окне с использованием QWidget::setAttribute(). Отказ Это должно убедиться, что диалог правильно разрушен, когда он закрыт. Увидеть Qt Документация Больше подробностей.

Предполагая, что память теперь правильно освобождена, указатель должен недействовать сам, из Qt Документация:

Охраняемый указатель, QPointer, ведет себя как обычный указатель C ++ T *, за исключением того, что он автоматически устанавливается на 0, когда ссылка на объект (в отличие от нормальных указателей C ++, которые становятся «висящими указателями» в таких случаях)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top