Как переопределить QApplication:: notify в Qt

Я пытаюсь обработать исключение в моем приложении Qt, я просмотрел пару сообщений, которые указывали на переопределение метода QApplication:: notify, чтобы эффективно обрабатывать исключения в Qt. Я не уверен, где я должен добавить этот метод переопределения. Это mainwindow.h или main.cpp? Я добавил следующую функцию в свой MainWindow.h:

bool
notify(QObject * rec, QEvent * ev)
{
  try
  {
    return QApplication::notify(rec,ev);
  }
  catch(Tango::DevFailed & e)
  {
    QMessageBox::warning(0,
                         "error",
                         "error");
  }

  return false;
}

Когда я создаю свой проект, я получаю следующую ошибку:

error: cannot call member function 'virtual bool QApplication::notify(QObject*, QEvent*)' without object

Я новичок в С++ и Qt. Не могли бы вы сообщить мне, как я мог бы реализовать это, чтобы все мои исключения были обработаны эффективным способом, и приложение не сбой.

Ответ 1

Это метод объекта QApplication. Чтобы переопределить метод QApplication вы должны наследовать от QApplication а в main() вы должны создать экземпляр класса в качестве приложения Qt

#include <QApplication>
class Application final : public QApplication {
public:
    Application(int& argc, char** argv) : QApplication(argc, argv) {}
    virtual bool notify(QObject *receiver, QEvent *e) override {
         // your code here
    }
};

int main(int argc, char* argv) {
    Application app(argc, argv);
    // Your initialization code
    return app.exec();
}

Ответ 2

ошибка: не может вызвать функцию-член 'virtual bool QApplication:: notify (QObject *, QEvent *)' без объекта

Это сообщение об ошибке пытается написать, что вы пытаетесь вызвать нестатический метод без фактического объекта. Могут работать только статические методы. Даже если бы это было предназначено именно так, а это не так, это не могло быть статическим методом, так как С++ не поддерживает виртуальные статические методы (к сожалению, но это еще одна тема).

Поэтому я лично сделал бы что-то вроде этого:

main.cpp

#include <QApplication>
#include <QEvent>
#include <QDebug>

class MyApplication Q_DECL_FINAL : public QApplication
{
    Q_OBJECT
public:
    MyApplication(int &argc, char **argv) : QApplication(argc, argv) {}

    bool notify(QObject* receiver, QEvent* event) Q_DECL_OVERRIDE
    {
        try {
            return QApplication::notify(receiver, event);
        //} catch (Tango::DevFailed &e) {
            // Handle the desired exception type
        } catch (...) {
            // Handle the rest
        }        

         return false;
     }
};

#include "main.moc"

int main(int argc, char **argv)
{
    MyApplication application(argc, argv);
    qDebug() << "QApplication::notify example running...";
    return application.exec();
}

main.pro

TEMPLATE = app
TARGET = main
QT += widgets
SOURCES += main.cpp

Сборка и запуск

qmake && make && ./main

Ответ 3

Как и с другими обработчиками событий в Qt, вам нужно определить дочерний класс, полученный из QApplication, и реализовать там bool notify (QObject *receiver, QEvent *e), а затем использовать свой класс вместо QApplication.