Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hellrider от Январь 12, 2013, 14:16



Название: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 14:16
Есть кнопка триггер, которая переключает QGridLayout-ы , в слотах перед созданием нового лайоута уничтожается старый, но я не могу проверить создан ли старый лайоут.
Как можно проверить выделена ли память для лайоута?


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Bepec от Январь 12, 2013, 14:58
Вызвать метод у него.
Если программа упадёт - значит не выделена.

А по сути - там где его уничтожаешь обнуляй указатель. А потом уже проверяй его на нуль.


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 15:23
Вызвать метод у него.
Если программа упадёт - значит не выделена.

А по сути - там где его уничтожаешь обнуляй указатель. А потом уже проверяй его на нуль.

Но если обнулить указатель перед проверкой на ноль для удаления, то каким образом удаляется выделенная память под него? Вроде указатель после обнуления уже не будет указывать
на память?


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: lit-uriy от Январь 12, 2013, 15:25
>но я не могу проверить создан ли старый лайоут.
что-то нехорошо в твоей программе устроено.
Компоновщик устанавливается на некий виджет, виджет может иметь только один непосредственный компоновщик.
У виджета всегда можно спросить его компоновщик.


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: lit-uriy от Январь 12, 2013, 15:25
>>если обнулить указатель перед проверкой на ноль для удаления
А почему "до"?


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 16:12
>но я не могу проверить создан ли старый лайоут.
что-то нехорошо в твоей программе устроено.
Компоновщик устанавливается на некий виджет, виджет может иметь только один непосредственный компоновщик.
У виджета всегда можно спросить его компоновщик.
Программа сохраняет в настроки при закрытии определенный слот с компоновкой, который будет загружен при запуске, в таком случае нельзя спросить виджет его компоновщик.
А тот же слот отвечает за динамическую смену лайоута во время работы программы.

>>если обнулить указатель перед проверкой на ноль для удаления
А почему "до"?

А как проверить выделена ли память для указателя? if(layout != 0) delete layout; ?




Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: kambala от Январь 12, 2013, 18:33
Программа сохраняет в настроки при закрытии определенный слот с компоновкой
что простите?..
А как проверить выделена ли память для указателя? if(layout != 0) delete layout; ?
да, только после делит надо еще указателю присвоить 0. а если использовать QPointer<MyClass> вместо MyClass *, то он будет автоматически обнуляться при удалении.


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 19:35
Программа сохраняет в настроки при закрытии определенный слот с компоновкой
что простите?..
А как проверить выделена ли память для указателя? if(layout != 0) delete layout; ?
да, только после делит надо еще указателю присвоить 0. а если использовать QPointer<MyClass> вместо MyClass *, то он будет автоматически обнуляться при удалении.

Ну в смысле в настройках сохраняется значение, которое определяет в котором из слотов расположена нужная компоновка (у меня два слота, которые имеют разную компоновку для
одного виджета).

Пробовал QPointer<QGridLayout*> layout; - вызывало ошибку, мол QPointer не имеет методов, которые в лайоутах определены.
Если делать просто if(layout != 0) delete layout; то даже в не инициилизированном указателе всегда есть мусор и состояние правильно не определить.


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: lit-uriy от Январь 12, 2013, 19:37
>что простите?..
присоединяюсь к вопросу, что подразумевается под слотами? В терминах Qt, слот - функция-член класса, к которой можно получить доступ через мета-объектную систему Qt


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 19:45
>что простите?..
присоединяюсь к вопросу, что подразумевается под слотами? В терминах Qt, слот - функция-член класса, к которой можно получить доступ через мета-объектную систему Qt
слот - функция-член класса. то что в public slots:  ;D


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: kambala от Январь 12, 2013, 20:42
правильно QPointer<QGridLayout>, без звездочки (внимательно читать надо)
Цитировать
то даже в не инициилизированном указателе всегда есть мусор и состояние правильно не определить.
естественно. поэтому в конструкторе (ну или где тебе нужно) надо обнулять указатели.


Название: Re: Как проверить выделена ли память для QGridLayout?
Отправлено: Hellrider от Январь 12, 2013, 20:56
правильно QPointer<QGridLayout>, без звездочки (внимательно читать надо)
Цитировать
то даже в не инициилизированном указателе всегда есть мусор и состояние правильно не определить.
естественно. поэтому в конструкторе (ну или где тебе нужно) надо обнулять указатели.
Буду пробовать. Спасибо