Russian Qt Forum
Ноябрь 25, 2024, 14:33
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Создание и удаление элементов. Освобождение памяти
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Создание и удаление элементов. Освобождение памяти (Прочитано 6273 раз)
Goshman
Гость
Создание и удаление элементов. Освобождение памяти
«
:
Февраль 07, 2009, 09:40 »
Добрый день всем!
Начал писать приложение для некой embedded железяки. С Qt ранее не встречался, но начинать когда-то надо.
Амбула. Есть основной виджет Qwidget *mWid (глобальная переменная), частично включающий следующие элементы:
class MainWidget : public QWidget {
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
<...>
public slots:
void screen_update();
<...>
private:
QFrame *frm;
<...>
};
Есть ряд классов, наследников от QFrame: class Screen_A0: public QFrame{<...>}, class Screen_A1: public QFrame{<...>}, class Screen_A2: public QFrame{<...>} и т.д.
Внутреннее наполнение классов различно, но объединяет их одно: каждый класс содержит кнопки для выбора того или иного окна (Screen_A*).
Кусок реализации класса:
Screen_A1::Screen_A1(QWidget *parent): QFrame(parent) {
<...>
QPushButton *btn1 = new QPushButton(this);
<...>
connect(btn1, SIGNAL(released()), mWid, SLOT(screeen_update()));
<...>
}
В обработчике screeen_update() в зависимости от типа нажатой кнопки (ID кнопки передается в глобальную переменную) должно прорисовываться то или иное окно.
void MainWidget::screen_update() {
int ptr;
<...>
delete frm; // previous frame delete
switch (ptr) {
case 0: frm = new Screen_A0(this); break;
case 11: frm = new Screen_A1(this); break;
case 12: frm = new Screen_A2(this); break;
case 13: frm = new Screen_A3(this); break;
<...>
}
}
Идея была следующая: удаляю предыдущий фрейм с наполнением и следом создаю новый. Компилятор не ругается, окна отрисовываются, но есть сомнения в правильности подхода, ведь элемент удаляется по сигналу, формируемому собственной кнопкой. Удаляется ли обект? Освобождается ли память? Пробовал использовать отложенное удаление frm->deleteLater() - визуально работает также, однако я опасаюсь использовать конструкции, принципов работы которых не понимаю.
Что уважаемые Гуру могут мне посоветовать? Правильно я решаю задачу перехода по окнам или есть более правильные подходы?
Записан
SABROG
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #1 :
Февраль 07, 2009, 10:01 »
Можно использовать аттрибут окна Qt::WA_DeleteOnClose, а по слоту вызывать не удаление самого себя, а обычный QWidget::close(). QObject::deleteLater() удаляет объект при возвращении управления в основной loop event, когда уже отработали все сигналы и слоты.
Насчет самой идеи немного не понятно что ты хочешь сделать, но возможно есть смысл посмотреть в сторону QStackedLayout или QStackedWidget.
Записан
BRE
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #2 :
Февраль 07, 2009, 10:21 »
А имеет ли смысл все время удалять и формировать страницы?
Может лучше использовать QStackedWidget?
Записан
Goshman
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #3 :
Февраль 07, 2009, 13:41 »
QStackedWidget сейчас посмотрю обязательно, спасибо.
А идея удаления окон в том, чтобы освобождать память при смене окна, которой в эмбеддид железяке всего 64 метра (а еще линукс и кутопия).
Записан
Goshman
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #4 :
Февраль 07, 2009, 20:33 »
Еще вопрос. Создан фрэйм frm = new Screen_A1(this). При его удалении delete frm нужно ли в деструкторе Screen_A1 удалять дочерние элементы и связи, или они удаляются автоматически?
В документации на Qt вроде ручного удаления не требуется, однако, если верить виндовому диспетчеру задач, то память при этом не высвобождается.
Записан
Rcus
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #5 :
Февраль 07, 2009, 21:27 »
Много раз уже про это писали: функции выделения памяти из системы довольно затратны по ресурсам (переключение контекста и все такое). Поэтому библиотека crt реализует внутренний менеждер памяти, который захватывает память у системы большими кусками и распределяет внутри приложения, а при необходимости освобождает (емнип освобождаются только полностью свободные страницы, а из-за фрагментации кучи их может быть мало)
Записан
ритт
Гость
Re: Создание и удаление элементов. Освобождение памяти
«
Ответ #6 :
Февраль 07, 2009, 22:45 »
ыы...с каких пор можно верить вендовому диспетчеру задач?
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...