Вызов деструктора Qt для закрытого виджета

Есть приложение, которое обрабатывает текстовые команды. У меня есть виджет 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?

8
задан axe 18 August 2011 в 13:43
поделиться