Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 20.08.2012, 08:00   #1
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 561
Репутация: 126

skype: ilya10009
По умолчанию Qt удаление потомков

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

icq: 482-373-277
По умолчанию

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

skype: ilya10009
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Никогда не копался в исходниках кьюта, но общая идея очень простая: все потомки - наследники 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
Репутация: 473

icq: 482-373-277
По умолчанию

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

skype: ilya10009
По умолчанию

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

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

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

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

skype: ilya10009
По умолчанию

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

icq: 482-373-277
По умолчанию

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


19:04.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru