15

我试图在我的 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 的新手。你能告诉我如何实现它,以便以有效的方式处理我的所有异常并且应用程序不会崩溃。

4

3 回答 3

15

这是一个 QApplication 对象的方法。为了覆盖你必须继承的 notify 方法QApplicationmain()你应该将一个类实例化为 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();
}
于 2014-12-22T17:55:49.413 回答
4

错误:无法在没有对象的情况下调用成员函数 'virtual bool QApplication::notify(QObject*, QEvent*)'

该错误消息试图写出您正在尝试调用没有实际对象的非静态方法。只有静态方法才能这样工作。即使它是这样打算的,但它不是静态方法,因为 C++ 不支持虚拟静态方法(很遗憾,但这是另一个话题)。

因此,我个人会做这样的事情:

主文件

#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();
}

主程序

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

构建并运行

qmake && make && ./main
于 2014-12-22T18:02:37.120 回答
1

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

于 2014-12-22T17:54:39.420 回答