Russian Qt Forum
Ноябрь 25, 2024, 14:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание и удаление элементов. Освобождение памяти  (Прочитано 6272 раз)
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
Гость
« Ответ #1 : Февраль 07, 2009, 10:01 »

Можно использовать аттрибут окна Qt::WA_DeleteOnClose, а по слоту вызывать не удаление самого себя, а обычный QWidget::close(). QObject::deleteLater() удаляет объект при возвращении управления в основной loop event, когда уже отработали все сигналы и слоты.

Насчет самой идеи немного не понятно что ты хочешь сделать, но возможно есть смысл посмотреть в сторону QStackedLayout или QStackedWidget.
Записан
BRE
Гость
« Ответ #2 : Февраль 07, 2009, 10:21 »

А имеет ли смысл все время удалять и формировать страницы?
Может лучше использовать QStackedWidget?
Записан
Goshman
Гость
« Ответ #3 : Февраль 07, 2009, 13:41 »

QStackedWidget сейчас посмотрю обязательно, спасибо.
А идея удаления окон в том, чтобы освобождать память при смене окна, которой в эмбеддид железяке всего 64 метра (а еще линукс и кутопия).
Записан
Goshman
Гость
« Ответ #4 : Февраль 07, 2009, 20:33 »

Еще вопрос. Создан фрэйм frm = new Screen_A1(this). При его удалении delete frm нужно ли в деструкторе Screen_A1 удалять дочерние элементы и связи, или они удаляются автоматически?
В документации на Qt вроде ручного удаления не требуется, однако, если верить виндовому диспетчеру задач, то память при этом не высвобождается.
Записан
Rcus
Гость
« Ответ #5 : Февраль 07, 2009, 21:27 »

Много раз уже про это писали: функции выделения памяти из системы довольно затратны по ресурсам (переключение контекста и все такое). Поэтому библиотека crt реализует внутренний менеждер памяти, который захватывает память у системы большими кусками и распределяет внутри приложения, а при необходимости освобождает (емнип освобождаются только полностью свободные страницы, а из-за фрагментации кучи их может быть мало)
Записан
ритт
Гость
« Ответ #6 : Февраль 07, 2009, 22:45 »

ыы...с каких пор можно верить вендовому диспетчеру задач?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 21.