32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
1

Вылетает программа после закрытия диалогового окна

21.06.2016, 11:02. Показов 1627. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть диалог в котором открывается qwebview

header
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class webViewDialog: public QDialog
{
  Q_OBJECT
public:
  webViewDialog(QNetworkCookieJar&, const QString&);
  void SetWorkData(QString,QString,QByteArray*,QString);
 
private:
  QWidget * wid = new QWidget(this);
  QWebView wv;
  QProgressBar pBar;
  QLabel label;
  QString JavaScript;
  QNetworkAccessManagerFilter qnam;
 
 
  QString StartUrl;
  QString EndUrl;
  QByteArray * lp_Cookie;
 
signals:
 
public slots:
 
  void LoadComplete();
};
sourse

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
webViewDialog::webViewDialog(QNetworkCookieJar& cook,const QString& userAgent)
{
 
 
  wid->setGeometry(0,0,1200,600);
  wv.setParent(wid);
  pBar.setParent(wid);
  label.setParent(wid);
  label.setGeometry(5,0,60,20);
  label.setText("Load Page:");
  pBar.setGeometry(70,0,1130,20);
  wv.setGeometry(0,20,1200,600);
  wv.setPage(new UserAgentWebPage(userAgent));
  //wv.page()->setNetworkAccessManager(&qnam);
  wv.page()->setNetworkAccessManager(new QNetworkAccessManagerFilter());
  wv.page()->networkAccessManager()->setCookieJar(&cook);
  connect(&wv,SIGNAL(loadFinished(bool)),this,SLOT(LoadComplete()));
  connect(&wv,SIGNAL(loadProgress(int)),&pBar,SLOT(setValue(int)));
 
}
интересует следующий вопрос, когда я устанавливаю QNetworkAccessManagerFilter который лежит локально wv.page()->setNetworkAccessManager(&qnam); программа при закрытии диалогового окна вылетает,
а так wv.page()->setNetworkAccessManager(new QNetworkAccessManagerFilter()); нормально работает, почему??

и еще, я так понимаю qwebview сам очистит память выделеную под new QNetworkAccessManagerFilter() и new UserAgentWebPage(userAgent) ??? или мне нужно делаь так new QNetworkAccessManagerFilter(this) ???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2016, 11:02
Ответы с готовыми решениями:

Уничтожение окна после закрытия
Form1 и Form2 наследники QDialog int openForm(const QString &name) { void *form; ...

Сохранение данных после закрытия окна
]У меня есть программа в которой есть график, слайдер, кнопка и спинбоксы... суть программы такова:...

После выбора файла через QFileDialog программа вылетает с ошибкой
написала код для открытия файла и передачи его на сервер. но когда я открываю диалог, а потом...

Глюк диалогового окна
Добрый день ув. форумчане! Вчера пытался создать свое диалоговое окно. Несмотря на то, что я позже...

11
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
22.06.2016, 14:54  [ТС] 2
чё ник-то не вкурсе? вроде такую ерунду спрашивю
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
22.06.2016, 15:19 3
mh-coder, а как он поймет, что память надо очищать?

Что такое &qnam?
0
675 / 452 / 158
Регистрация: 01.10.2015
Сообщений: 1,257
22.06.2016, 15:25 4
Цитата Сообщение от mh-coder Посмотреть сообщение
вроде такую ерунду спрашивю
ну раз ерунда, то почему бы самому не разобраться со своим кодом?
0
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
22.06.2016, 15:36 5
Основное правило - Всё что создаётся через оператор new без родителя, и без назначения такового в будущем, или назначение родителем объекта, чей код не предусматривает очистку дочерних объектов, удаляется затем вручную.
0
137 / 107 / 23
Регистрация: 06.10.2008
Сообщений: 451
22.06.2016, 15:50 6
Вероятно при создании
C++ (Qt)
1
 wv.setPage(new UserAgentWebPage(userAgent));
все происходит нормально, UserAgentWebPage(userAgent) - висит в куче
Далее ставим:
C++ (Qt)
1
wv.page()->setNetworkAccessManager(&qnam);
UserAgentWebPage(userAgent) - висит в куче
Далее закрываем диалог
UserAgentWebPage(userAgent) - висит в куче, а qnam - тютю.., ну нет его больше, программа понимает, что чего-то не хватает, и падает.
1
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
22.06.2016, 16:03 7
Вот именно, а когда делает new QNetworkAccessManagerFilter() всё висит в куче.
1
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
22.06.2016, 17:14  [ТС] 8
а как тогда сделать правильно?
так программа вылетает
C++ (Qt)
1
wv.page()->setNetworkAccessManager(&qnam);
а так оно всё время висит в куче
C++ (Qt)
1
wv.page()->setNetworkAccessManager(new QNetworkAccessManagerFilter());
диалг вызывается много кратно, тогда выходит что в памяти постоянно создается новый QNetworkAccessManagerFilter и память растет
0
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
22.06.2016, 18:11 9
Делов-то, определяй при создании переменные через new и убивай в деструкторе.

Добавлено через 37 минут
Вообще дебагер что говорит? на какой строке какого файла он вам показывает остановку?
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
22.06.2016, 19:12 10
mh-coder, либо создать один раз объекты и передавать на них ссылку в конструкторе, сохраняя эти объекты, либо каждый раз создавая и убивая, в порядке обратном созданию.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
22.06.2016, 20:32  [ТС] 11
я так прошелся дебагером, вылетает в деструкторе на
C++ (Qt)
1
delete lp_QNetworkCookieJar;
пришел к выводу что QNetworkAccessManager за собой подчищает... хоть бы где про такое написали, я просто почему делал так
C++ (Qt)
1
wv.page()->setNetworkAccessManager(new QNetworkAccessManagerFilter());
так делают во всех примерах что я находил в инете, может и весь вебкит за собой подчищает и мне вообще ненужно ничего в деструкторе удалять? ник-то не сталкивался?
0
137 / 107 / 23
Регистрация: 06.10.2008
Сообщений: 451
23.06.2016, 07:33 12
C++ (Qt)
1
new UserAgentWebPage(userAgent)
- не имеет парента, можно попробовать либо парента воткнуть, либо его в деструкторе почикать
0
23.06.2016, 07:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2016, 07:33
Помогаю со студенческими работами здесь

Создание диалогового окна
Помогите пожалуйста описать класс диалогового окна... сейчас пробую так: qqq.h #ifndef QQQ_H...

Создание диалогового окна
Здравствуйте. Мне необходимо создать диалоговое окно. В программе есть один пункт меню "о...

Закрытие диалогового окна из слота
Приветствую! Надеюсь сможете помочь с решением данной задачи: Если смотреть глобально нужно...

Временное скрытие диалогового окна
Доброго времени суток. Есть окно, в котором находится QGraphicsView и QGraphicsScene....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru