如何在Qt中重载QApplication::notify函数

16

我正在尝试处理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的新手,你能告诉我如何实现这一点,以便所有异常都能高效地处理,应用程序不会崩溃。


@lpapp 我没有取消选择答案。我也尝试使用了你的方法,它也起作用了。但显然它只允许我选择一个帖子作为答案。 - Valla
@lpapp 我正在使用Qt5。不确定在哪里检查编译器?但是为了运行程序,我只需遵循这些步骤:运行qmake>>构建>>运行。 - Valla
@lpapp 在 Debian 上使用它。 - Valla
@lpapp,我确实说过你的解决方案有效。但是在实施后,我又遇到了另一个问题。这就是我发布这个问题的原因。无论如何,感谢你的帮助。 - Valla
也许下次你在撤销选择时会更加小心! - László Papp
显示剩余6条评论
3个回答

15

这是一个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();
}

我将相同的代码添加到我的Qt应用程序中。在上面显示的updatescreen.cpp中,该方法是否应该再次被调用?你能告诉我这里缺少什么吗?我编辑了我的问题并包含了我在应用程序中使用的代码。 - Valla
你知道它是由异常还是信号崩溃的吗?这两种情况是不同的。例如,它是否因为SIGSEGV而崩溃?如果是这样,你需要正确地处理它。正确的信号处理很复杂,我建议使用我们工作中使用的E4C库。 https://code.google.com/p/exceptions4c/。在你的通知方法中创建一个E4C上下文,以便检查任何信号异常。 - McLeary
让我们在聊天中继续这个讨论 - Valla
我没有使用任何信号,这只是一个基本的更新方法...在该方法中,我有一个写入方法...如果该写入方法失败,则应该引发异常...异常已被处理...但应用程序崩溃了... - Valla
构造函数需要添加 "public:"以使其为公共函数。 - Adriel Jr
显示剩余3条评论

4

错误:无法在没有对象的情况下调用成员函数'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

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接