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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как проверить выделена ли память для QGridLayout?  (Прочитано 5085 раз)
Hellrider
Гость
« : Январь 12, 2013, 14:16 »

Есть кнопка триггер, которая переключает QGridLayout-ы , в слотах перед созданием нового лайоута уничтожается старый, но я не могу проверить создан ли старый лайоут.
Как можно проверить выделена ли память для лайоута?
« Последнее редактирование: Январь 12, 2013, 14:55 от Hellrider » Записан
Bepec
Гость
« Ответ #1 : Январь 12, 2013, 14:58 »

Вызвать метод у него.
Если программа упадёт - значит не выделена.

А по сути - там где его уничтожаешь обнуляй указатель. А потом уже проверяй его на нуль.
Записан
Hellrider
Гость
« Ответ #2 : Январь 12, 2013, 15:23 »

Вызвать метод у него.
Если программа упадёт - значит не выделена.

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

Но если обнулить указатель перед проверкой на ноль для удаления, то каким образом удаляется выделенная память под него? Вроде указатель после обнуления уже не будет указывать
на память?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 12, 2013, 15:25 »

>но я не могу проверить создан ли старый лайоут.
что-то нехорошо в твоей программе устроено.
Компоновщик устанавливается на некий виджет, виджет может иметь только один непосредственный компоновщик.
У виджета всегда можно спросить его компоновщик.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Январь 12, 2013, 15:25 »

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

Юра.
Hellrider
Гость
« Ответ #5 : Январь 12, 2013, 16:12 »

>но я не могу проверить создан ли старый лайоут.
что-то нехорошо в твоей программе устроено.
Компоновщик устанавливается на некий виджет, виджет может иметь только один непосредственный компоновщик.
У виджета всегда можно спросить его компоновщик.
Программа сохраняет в настроки при закрытии определенный слот с компоновкой, который будет загружен при запуске, в таком случае нельзя спросить виджет его компоновщик.
А тот же слот отвечает за динамическую смену лайоута во время работы программы.

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

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


Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Январь 12, 2013, 18:33 »

Программа сохраняет в настроки при закрытии определенный слот с компоновкой
что простите?..
А как проверить выделена ли память для указателя? if(layout != 0) delete layout; ?
да, только после делит надо еще указателю присвоить 0. а если использовать QPointer<MyClass> вместо MyClass *, то он будет автоматически обнуляться при удалении.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hellrider
Гость
« Ответ #7 : Январь 12, 2013, 19:35 »

Программа сохраняет в настроки при закрытии определенный слот с компоновкой
что простите?..
А как проверить выделена ли память для указателя? if(layout != 0) delete layout; ?
да, только после делит надо еще указателю присвоить 0. а если использовать QPointer<MyClass> вместо MyClass *, то он будет автоматически обнуляться при удалении.

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

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Январь 12, 2013, 19:37 »

>что простите?..
присоединяюсь к вопросу, что подразумевается под слотами? В терминах Qt, слот - функция-член класса, к которой можно получить доступ через мета-объектную систему Qt
Записан

Юра.
Hellrider
Гость
« Ответ #9 : Январь 12, 2013, 19:45 »

>что простите?..
присоединяюсь к вопросу, что подразумевается под слотами? В терминах Qt, слот - функция-член класса, к которой можно получить доступ через мета-объектную систему Qt
слот - функция-член класса. то что в public slots:  Смеющийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Январь 12, 2013, 20:42 »

правильно QPointer<QGridLayout>, без звездочки (внимательно читать надо)
Цитировать
то даже в не инициилизированном указателе всегда есть мусор и состояние правильно не определить.
естественно. поэтому в конструкторе (ну или где тебе нужно) надо обнулять указатели.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hellrider
Гость
« Ответ #11 : Январь 12, 2013, 20:56 »

правильно QPointer<QGridLayout>, без звездочки (внимательно читать надо)
Цитировать
то даже в не инициилизированном указателе всегда есть мусор и состояние правильно не определить.
естественно. поэтому в конструкторе (ну или где тебе нужно) надо обнулять указатели.
Буду пробовать. Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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