Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2012, 08:00   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию Qt удаление потомков

хочу более подробно разобратся как удаляются потомки при удалении родительского виджета. В литературе описания этого процесса не встречал. Как можно самому такой класс написать(не в Qt)?
SAMOUCHKA вне форума Ответить с цитированием
Старый 20.08.2012, 08:41   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Никогда не копался в исходниках кьюта, но общая идея очень простая: все потомки - наследники QWidget, поэтому у родителя есть список указателей на QWidget - список всех дочерних виджетов. В деструкторе просто вызывается delete для каждого элемента списка.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 20.08.2012, 14:42   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Никогда не копался в исходниках кьюта, но общая идея очень простая: все потомки - наследники QWidget, поэтому у родителя есть список указателей на QWidget - список всех дочерних виджетов. В деструкторе просто вызывается delete для каждого элемента списка.
ага а если я сам создаю дочерний виджет, то в списке его не будет.
Как тут создать деструктор?
Код:
#include <iostream>
#include <string>

using namespace std;

class c0
{
    protected:
        string str0;
    public:
        c0()
        {
            str0 = "CLASS c0";
        }
        void print_c0()
        {
            cout<<str0<<endl;
        }
};
class c1:public c0
{
    protected:
        string str1;
    public:
    c1()
    {
        str1 = "KLASS c1";
        c0 *class_c0 = new c0;
    }
    void print_c1()
    {
        cout<<str0<<endl;
        cout<<str1<<endl;
    }
};

int main()
{
    return 0;
}
там еще макрос Q_OBJECT какуюто роль играет, а что в нем?

Последний раз редактировалось SAMOUCHKA; 20.08.2012 в 14:56.
SAMOUCHKA вне форума Ответить с цитированием
Старый 20.08.2012, 15:16   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А при чем здесь вообще наследование?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 20.08.2012, 15:24   #5
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
А при чем здесь вообще наследование?
ну вы же сами сказали у QWidget есть список всех дочерних виджетов, а если я свой создал.

к примеру я в главном окне распологал кнопки и виджет, который создал посредством наследования от QGLWidget. как он удаляется?

или я что то не так понял?
SAMOUCHKA вне форума Ответить с цитированием
Старый 20.08.2012, 15:53   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Все конструкторы в Qt обычно могут получать указатель на родительский QObject - вероятно там и происходит регистрация дочерного объекта. Информация по памяти, могу и ошибаться.
waleri вне форума Ответить с цитированием
Старый 20.08.2012, 16:31   #7
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

да в качестве параметра, в конструктор, передается указатель this.
на как конкретно это делается? как мне самому реализовать такую технологию?
SAMOUCHKA вне форума Ответить с цитированием
Старый 20.08.2012, 17:32   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Дочерние виджеты - это понятие, никак не связанное с наследованием.

Пусть у нас есть виджет главного окна. Мы хотим расположить на нем различные элементы управления: надписи, кнопки, поля ввода, полосы прокрутки, картинки и т.п. Для этого мы создаем эти самые объекты, при этом указывая, что родителем будет именно этот виджет главного окна.

Быть виджетом-родителем значит, что: а) дочерние виджеты располагаются внутри области родительского виджета (вы даже можете сделать кнопку достаточно больших размеров, а потом на ней как на родителе расположить другие кнопки, комбобоксы, надписи... хотя это уже извращение, но принципиально возможно и легко осуществимо); б) родитель управляет памятью своих дочерних виджетов - при его удалении он сам позаботится об удалении дочерних виджетов.

Сделать один виджет родителем другого можно двумя с половиной способами: 1+1.5) явно указав это либо передав указатель на родительский виджет в конструкторе, либо позже, вызвав для него функцию-член setParent 2.5) добавив виджет, созданный без указания родителя, в лэйаут, а затем назначив этот лэйаут виджету-родителю функцией setLayout (тогда внутри этой функции тот просмотрит, кого же ему в этом лэйауте подсунули и, очевидно, для всех их вызовет функцию setParent, указав себя в качестве нового приемного родителя; однако, это все произойдет в недрах библиотеки без всякого вашего участия).

Строго говоря, виджет может быть родителем не только других виджетов, но и любых объектов, унаследованных от QObject (например, сокеты, потоки, таймеры и другие) - равно как и объекты, унаследованные от QObject могут сами быть родителями. Многие такие объекты не являются элементами GUI (т.е. потомками QWidget) и поэтому отношения родитель-дочерний объект для них ограничиваются только пунктом б) - родитель уничтожает дочерние объекты в своем деструкторе. Как фараон.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление ala Свободное общение 28 26.03.2021 15:44
Удаление RX artemavd БД в Delphi 1 14.06.2009 19:24