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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: setModel  (Прочитано 12825 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Январь 22, 2014, 15:35 »

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{        
   ui->setupUi(this);
 
    root = new QObject(this);
 
   treeview = new TreeView(this);
   treemodel = new TreeModelBrowser(root);
   treeview->setModel(treemodel);
 
}
 

Скажите в данной ситуации treeview является  дочкой MainWindow или treemodel?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Январь 22, 2014, 15:51 »

Если имеется ввиду всё-таки модель, то документация:

Цитировать
void QAbstractItemView::setModel(QAbstractItemModel *model)
...
The view does not take ownership of the model unless it is the model's parent object because the model may be shared between many different views.

Если view, то непонятно почему возник такой вопрос - это первые уроки по Qt. Объект является ребёнком того объекта, который был передан как родитель в конструкторе. Т.е. MainWindow.
« Последнее редактирование: Январь 22, 2014, 15:54 от Alex Custov » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Январь 22, 2014, 16:01 »

Согласен
Но когда я закрываю главное окно MainWidow в дебаг не выводится "Delete TreeView"

Код
C++ (Qt)
void TreeView::actWscan()
{
           wps = new widgetScan()            
           wps->show();  
}
 
 
TreeView::~TreeView()
{
   qDebug()<<"Delete TreeView";
 
   if(wscan != NULL)
   {
       wscan->close();
       wscan = NULL;
   }
}
 

Код
C++ (Qt)
widgetScan::widgetScan(QWidget *parent):
   QWidget(parent)
{
   setAttribute(Qt::WA_DeleteOnClose);
}
 
Записан
Hrundel
Гость
« Ответ #3 : Январь 23, 2014, 00:38 »

А ты удаление объекта явно вызови и увидишь.

На сколько я понимаю, при удалении наследников, просто, адрес памяти удаляется из таблицы, а бинарный мусор на этом месте остается не перезаписанным нулями (то есть не равно 0х0, это хорошо видно при дебаге). Однако это место в памяти уже не является резервированным.

Следовательно, если хочешь чтобы происходили события для деструктора - вызывай его явно.

В твоем варианте wps = new widgetScan() не является потомком TreeView, а значит его нужно удалять. Поэтому в событии close() нужно вызвать деструктор TreeView.

Если написать  wps = new widgetScan(this),  то будет удаляться и без деструктора по цепочке от дальнего предка к родителю.
« Последнее редактирование: Январь 23, 2014, 00:51 от Hrundel » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Январь 23, 2014, 10:42 »

Следовательно, если хочешь чтобы происходили события для деструктора - вызывай его явно.

Это бред, странно что приходится обсуждать вызов деструктора тут  Шокированный
Записан
Serr500
Гость
« Ответ #5 : Январь 23, 2014, 11:47 »

На сколько я понимаю, при удалении наследников, просто, адрес памяти удаляется из таблицы, а бинарный мусор на этом месте остается не перезаписанным нулями (то есть не равно 0х0, это хорошо видно при дебаге). Однако это место в памяти уже не является резервированным.

Следовательно, если хочешь чтобы происходили события для деструктора - вызывай его явно.
Абсолютно неверно! При удалении обекта всегда вызывается его деструктор (экстремальные случаи рассматривать не будем  Подмигивающий ). То есть стековые переменные при выходе из области видимости автоматически разрушаются с вызовом деструктора, а переменные в куче разрушаются с вызовом деструктора при удалении оператором delete.

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

Правы Вы только в одном - обычно при разрушении объектов их память не обнуляется.
Записан
Hrundel
Гость
« Ответ #6 : Январь 23, 2014, 12:41 »

Простите за некорректную формулировку на русском, я информатику на немецком изучаю. Вообще, под явным вызовом деструктора я подразумевал применение оператора delete. "Умные указатели" я, честно говоря, слабо понимаю, потому что на лекциях их затронули очень поверхностно. (Но речь то надо толкнуть, чтобы проверить что другие скажут Веселый )
« Последнее редактирование: Январь 23, 2014, 12:43 от Hrundel » Записан
Serr500
Гость
« Ответ #7 : Январь 24, 2014, 09:22 »

"Умные указатели" я, честно говоря, слабо понимаю, потому что на лекциях их затронули очень поверхностно.
Там и понимать-то нечего.  Улыбающийся Если рассматривать самый простой "умный указатель", то это некий объект с конструктором и деструктором, который содержит ссылку на некие общие данные. Общие данные состоят из обычного указателя на нужный нам объект и счётчика ссылок. При создании копии умного указателя счётчик ссылок увеличивается, при разрушении - уменьшается. Последний разрушаемый умный указатель разрушает объект, указатель на который он хранит. Вот и всё.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #8 : Январь 24, 2014, 13:56 »

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   newWidow = NULL;
   connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(addNewWindow()));
 
   setAttribute(Qt::WA_DeleteOnClose);
}
 
MainWindow::~MainWindow()
{
   delete ui;
 
   if(newWidow != NULL)
   {
       newWidow->close();
       delete newWidow;
       newWidow = NULL;
   }
}
 
void MainWindow::addNewWindow()
{
   if(newWidow == NULL)
   {
       newWidow = new MyWidget;
       connect(newWidow,SIGNAL(closeMyWidget()),this,SLOT(nullNewWindow()));
       newWidow->show();
   }
}
 
void MainWindow::nullNewWindow()
{
   newWidow = NULL;
}
 
 

Код
C++ (Qt)
MyWidget::MyWidget(QWidget *parent):
   QWidget(parent)
{
   setAttribute(Qt::WA_DeleteOnClose);
}
 
MyWidget::~MyWidget()
{
   Q_EMIT closeMyWidget();
}
 

Не могу понять почему код работает с ошибкой Непонимающий
Пожалуйста подскажите Улыбающийся
« Последнее редактирование: Январь 24, 2014, 13:59 от demaker » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Январь 24, 2014, 14:19 »

delete newWidow; — убери, оно и так само удаляется
Записан

Изучением 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
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #10 : Январь 24, 2014, 14:35 »

delete newWidow; — убери, оно и так само удаляется

убрал ,но
в debug пишет
Код:
Okna-build-desktop\debug\Okna.exe завершился с кодом -1073741819
« Последнее редактирование: Январь 24, 2014, 14:47 от demaker » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Январь 24, 2014, 14:48 »

demaker, если у тебя функция main выглядит так:
Код
C++ (Qt)
Qapplication app;
MainWindow w;
w.show();
return app.exec();
то ты никогда не дождёшся работы деструктора, т.к. деструктор w должен вызваться после того как закончит работу app.exec(), но программа тут же завершается.

Для тестов можешь попробовать это
Записан

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Январь 24, 2014, 14:49 »

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

P.S. вместо NULL пиши 0.
Записан

Изучением 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
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #13 : Январь 24, 2014, 15:04 »

Для тестов можешь попробовать это

Спасибо, но не помогло
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #14 : Январь 24, 2014, 15:11 »

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

И что мне с этим делать Непонимающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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