Есть приложение, которое обрабатывает текстовые команды. У меня есть виджет Qt, который закрывается какой-то командой close *
. Атрибут Qt :: WA_DeleteOnClose
установлен для этого виджета, он получает closeEvent, но деструктор для этого объекта вызывается позже (я думаю, в режиме ожидания). Если у меня две команды
закрыть *; получить что-то;
программа вылетает из-за того, что get something
вызывается перед деструктором для этого виджета, поэтому он пытается получить доступ к данным, удаленным командой close *
. Как заставить Qt вызывать деструкторы? QCoreApplication :: processEvents ()
после команды закрытия не помогает.
У меня возникла эта проблема после изменения версии qt на 4.7.2 с 4.3.3. Здесь нет многопоточности.
Заранее спасибо.
добавлено
Вот пример кода.
test *t = new test();
t->show();
std::cout << "before deleteLater()" << std::endl;
t->deleteLater();
std::cout << "after deleteLater()" << std::endl;
QCoreApplication::sendPostedEvents();
QCoreApplication::processEvents();
std::cout << "after processEvents()" << std::endl;
тестовый класс является производным от QDialog. Он печатает test ()
в конструкторе и ~ test ()
в деструкторе. Этот код дает следующий вывод
test()
before deleteLater()
after deleteLater()
after processEvents()
~test()
Согласно документации Qt, он должен удалить объект перед последним cout, я прав? Похоже на ошибку в Qt, кто-нибудь знает об этом? Есть ли обходной путь?
Я задал вопрос в списке рассылки Qt, но все еще жду ответа.
Спасибо.
еще одно обновление
Этот код
Dialog::~Dialog() {
std::cout << "~test()" << std::endl;
}
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
Dialog* dlg = new Dialog();
dlg->setAttribute(Qt::WA_DeleteOnClose);
dlg->show();
dlg->close();
std::cout << "before sendPostedEvents()" << std::endl;
QCoreApplication::sendPostedEvents();
std::cout << "after sendPostedEvents()" << std::endl;
return app.exec();
}
печатает это
before sendPostedEvents()
after sendPostedEvents()
~test()
, но как только Я добавляю обработчик closeEvent и вызываю deleteLater () в этом обработчике, функция sendPostedEvents начинает удаление отложенных объектов.
void Dialog::closeEvent(QCloseEvent* ev) {
deleteLater();
QWidget::closeEvent(ev);
}
печатает это перед sendPostedEvents () ~ тест () после sendPostedEvents ()
Кто-нибудь может объяснить, что, черт возьми, там происходит? Это просто ошибка? Могу ли я использовать это как обходной путь?
Как это работает? Разве Qt не должен вызывать deleteLater () автоматически после того, как closeEvent принят, если установлен атрибут CloseOnDelete?