Russian Qt Forum

Qt => Общие вопросы => Тема начата: Goshman от Февраль 07, 2009, 09:40



Название: Создание и удаление элементов. Освобождение памяти
Отправлено: 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() - визуально работает также, однако я опасаюсь использовать конструкции, принципов работы которых не понимаю.

Что уважаемые Гуру могут мне посоветовать? Правильно я решаю задачу перехода по окнам или есть более правильные подходы?


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: SABROG от Февраль 07, 2009, 10:01
Можно использовать аттрибут окна Qt::WA_DeleteOnClose, а по слоту вызывать не удаление самого себя, а обычный QWidget::close(). QObject::deleteLater() удаляет объект при возвращении управления в основной loop event, когда уже отработали все сигналы и слоты.

Насчет самой идеи немного не понятно что ты хочешь сделать, но возможно есть смысл посмотреть в сторону QStackedLayout или QStackedWidget.


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: BRE от Февраль 07, 2009, 10:21
А имеет ли смысл все время удалять и формировать страницы?
Может лучше использовать QStackedWidget?


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: Goshman от Февраль 07, 2009, 13:41
QStackedWidget сейчас посмотрю обязательно, спасибо.
А идея удаления окон в том, чтобы освобождать память при смене окна, которой в эмбеддид железяке всего 64 метра (а еще линукс и кутопия).


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: Goshman от Февраль 07, 2009, 20:33
Еще вопрос. Создан фрэйм frm = new Screen_A1(this). При его удалении delete frm нужно ли в деструкторе Screen_A1 удалять дочерние элементы и связи, или они удаляются автоматически?
В документации на Qt вроде ручного удаления не требуется, однако, если верить виндовому диспетчеру задач, то память при этом не высвобождается.


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: Rcus от Февраль 07, 2009, 21:27
Много раз уже про это писали: функции выделения памяти из системы довольно затратны по ресурсам (переключение контекста и все такое). Поэтому библиотека crt реализует внутренний менеждер памяти, который захватывает память у системы большими кусками и распределяет внутри приложения, а при необходимости освобождает (емнип освобождаются только полностью свободные страницы, а из-за фрагментации кучи их может быть мало)


Название: Re: Создание и удаление элементов. Освобождение памяти
Отправлено: ритт от Февраль 07, 2009, 22:45
ыы...с каких пор можно верить вендовому диспетчеру задач?