Как переопределить 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

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

9

Решение

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

#include <QApplication>
class Application final : public QApplication {
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();
}
9

Другие решения

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

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

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

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,

1
По вопросам рекламы [email protected]