Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: JamS007 от Июнь 22, 2010, 17:41



Название: Удаление обьекта по указателю
Отправлено: 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, или все-же стараться получить ссылку на обьект другим путем?


Название: Re: Удаление обьекта по указателю
Отправлено: BRE от Июнь 22, 2010, 17:42
Хочу спросить, корректно ли в даном случае удалять обьект по указателю типа QWidget, или все-же стараться получить ссылку на обьект другим путем?
Корректно. Деструктор виртуальный еще от QObject.


Название: Re: Удаление обьекта по указателю
Отправлено: Igors от Июнь 22, 2010, 17:52
К слову сказать, непонятно почему разрешается удалять константный указатель - ведь данные на которые он указывает будут изменены


Название: Re: Удаление обьекта по указателю
Отправлено: pastor от Июнь 22, 2010, 17:58
А где тут константный указатель?


Название: Re: Удаление обьекта по указателю
Отправлено: lit-uriy от Июнь 22, 2010, 18:10
Igors, там только метод константный, который возвращает не константный указатель.
Сам метод не изменяет класса


Название: Re: Удаление обьекта по указателю
Отправлено: BRE от Июнь 22, 2010, 18:26
В данном случае (с QTableWidget), наверное, корректней удалять виджет через:
Код
C++ (Qt)
setCellWidget( 2, 4, 0 );
 


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

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


Название: Re: Удаление обьекта по указателю
Отправлено: lit-uriy от Июнь 22, 2010, 19:33
да, BRE, действительно.
Хотя и не логично. Уже сложилась традиция именовать методы в Qt для "вытаскивания" - take.
Логичнее было бы сделать метод takeCellWidget, который бы вынимал виджет из ячейки.


Название: Re: Удаление обьекта по указателю
Отправлено: JamS007 от Июнь 22, 2010, 19:39
Код:
void QTableWidget::removeCellWidget ( int row, int column )

есть еще и такой метод, вопрос только в том, удаляет ли он обьект физически (из памяти) или только выниает из ячейки и при этом выделенная память остаеться.


Название: Re: Удаление обьекта по указателю
Отправлено: BRE от Июнь 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); }
 
:)