如何在Qt中覆盖QApplication :: notify

时间:2014-12-22 17:49:04

标签: c++ qt exception qtgui qapplication

我正在尝试在我的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的新手。如果你让我知道如何实现这一点,那么我的所有异常都将以有效的方式处理,应用程序不会崩溃。

3 个答案:

答案 0 :(得分:10)

这是QApplication对象的方法。为了覆盖notify方法,您必须从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();
}

答案 1 :(得分:3)

  

错误:无法调用成员函数'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

答案 2 :(得分:1)

就像Qt中的其他事件处理程序一样,您需要定义一个派生自QApplication的子类并在那里实现bool notify (QObject *receiver, QEvent *e),然后使用您的类而不是QApplication