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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление обьекта по указателю  (Прочитано 5634 раз)
JamS007
Гость
« : Июнь 22, 2010, 17:41 »

Здравствуйте,

в программе использую унаследованный от QPushButton класс (PropertyButton).
Код:
PropertyButton *removeUserBtn = new PropertyButton(this,item);

Обьекты даного класса пихаю в QTableWidget->setCellWidget(...).
Для корректной работы с памятью хочу удалить динамично созданный обьект, ссылку на него получаю функцией
Код:
QWidget * QTableWidget::cellWidget ( int row, int column ) const

но, как видно из определения, функция возвращает указатель на виджет, то есть типы QWidget и PropertyButton могут не совпадать по размеру.

Хочу спросить, корректно ли в даном случае удалять обьект по указателю типа QWidget, или все-же стараться получить ссылку на обьект другим путем?
Записан
BRE
Гость
« Ответ #1 : Июнь 22, 2010, 17:42 »

Хочу спросить, корректно ли в даном случае удалять обьект по указателю типа QWidget, или все-же стараться получить ссылку на обьект другим путем?
Корректно. Деструктор виртуальный еще от QObject.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 22, 2010, 17:52 »

К слову сказать, непонятно почему разрешается удалять константный указатель - ведь данные на которые он указывает будут изменены
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Июнь 22, 2010, 17:58 »

А где тут константный указатель?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Июнь 22, 2010, 18:10 »

Igors, там только метод константный, который возвращает не константный указатель.
Сам метод не изменяет класса
Записан

Юра.
BRE
Гость
« Ответ #5 : Июнь 22, 2010, 18:26 »

В данном случае (с QTableWidget), наверное, корректней удалять виджет через:
Код
C++ (Qt)
setCellWidget( 2, 4, 0 );
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 22, 2010, 19:31 »

А где тут константный указатель?
А я и не говорил что здесь он есть  Улыбающийся
Код:
const Coordinate * test = &theCoord;
delete test;
Не вижу даже warning'а. Неинтуитивно, что это за константа если ее просто могут замочить?

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июнь 22, 2010, 19:33 »

да, BRE, действительно.
Хотя и не логично. Уже сложилась традиция именовать методы в Qt для "вытаскивания" - take.
Логичнее было бы сделать метод takeCellWidget, который бы вынимал виджет из ячейки.
Записан

Юра.
JamS007
Гость
« Ответ #8 : Июнь 22, 2010, 19:39 »

Код:
void QTableWidget::removeCellWidget ( int row, int column )

есть еще и такой метод, вопрос только в том, удаляет ли он обьект физически (из памяти) или только выниает из ячейки и при этом выделенная память остаеться.
Записан
BRE
Гость
« Ответ #9 : Июнь 22, 2010, 19:48 »

Код:
void QTableWidget::removeCellWidget ( int row, int column )

есть еще и такой метод, вопрос только в том, удаляет ли он обьект физически (из памяти) или только выниает из ячейки и при этом выделенная память остаеться.
Код
C++ (Qt)
inline void QTableWidget::removeCellWidget(int arow, int acolumn)
{ setCellWidget(arow, acolumn, 0); }
 
Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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