Как я понимаю, способ обработки исключений, происходящих внутри цикла событий в Qt, заключается в переопределении QApplication :: notify() и его обработке. Я попробовал это, и это работает:Почему я не могу использовать QMessageBox в методе QApplication :: notify()
class Application : public QApplication
{
Q_OBJECT
public:
explicit Application(int& argc, char** argv);
// override to handle out of memory exceptions
bool notify(QObject* receiver, QEvent* e);
signals:
public slots:
private:
char* m_buffer;
};
Application::Application(int &argc, char **argv)
:QApplication(argc, argv)
{
m_buffer = new char[1024*1024];
}
bool Application::notify(QObject *receiver, QEvent *e)
{
try
{
return QApplication::notify(receiver, e);
}
catch(std::bad_alloc&)
{
if (m_buffer)
{
delete[] m_buffer;
m_buffer = NULL;
}
// calling QMessageBox from here doesn't work
// even if release a load of reserved memory
// don't know why
QMessageBox::critical(NULL, "Exception", "Application out of memory");
}
Но окно сообщения пустое, когда она появляется (т.е. не отображается правильно). Я думал, что, возможно, этого процесса недостаточно. Поэтому я попытался выделить 1 МБ памяти в начале (см. M_buffer выше), а затем отпустил ее до отображения QMessageBox. Но это тоже не сработало. Есть идеи?
Не будучи на 100% уверенным, что, когда он выходит из цикла событий QApplication, он также теряет доступ к элементам управления графическим интерфейсом. Может быть, в любом случае, я никогда не пытался переопределить ':: notify()' –
Я думал об этом. Но я видел примеры кода с QMessageBox, вызываемым из Application :: notify(). –
Это определенно головоломка, вы можете выделить QMessageBox на кучу? –