首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Qt中重写QApplication::QApplication

如何在Qt中重写QApplication::QApplication
EN

Stack Overflow用户
提问于 2014-12-22 17:49:04
回答 3查看 9.7K关注 0票数 15

我试图在我的Qt应用程序中处理异常,我浏览了几篇文章,其中指出要重写QApplication::QApplication方法,以便在Qt中有效地处理异常。我不知道该在哪里添加这种覆盖的方法。是主机窗口.h还是main.cpp?我在MainWindow.h中添加了以下函数:

代码语言:javascript
运行
复制
bool
notify(QObject * rec, QEvent * ev)
{
  try
  {
    return QApplication::notify(rec,ev);
  }
  catch(Tango::DevFailed & e)
  {
    QMessageBox::warning(0,
                         "error",
                         "error");
  }

  return false;
}

当我构建我的项目时,我会得到以下错误:

代码语言:javascript
运行
复制
error: cannot call member function 'virtual bool QApplication::notify(QObject*, QEvent*)' without object

我是c++和Qt.Could的新手,您让我知道如何实现这一点,这样我的所有异常都将得到有效的处理,并且应用程序不会崩溃。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-22 17:55:49

这是一个QApplication对象的方法。为了覆盖通知方法,您必须从QApplication继承,并且在您的main()中,您应该实例化类作为Qt应用程序

代码语言:javascript
运行
复制
#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();
}
票数 15
EN

Stack Overflow用户

发布于 2014-12-22 18:02:37

错误:没有对象不能调用成员函数‘虚拟::QApplication(QObject*,QEvent*)’

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

因此,我个人会这样做:

main.cpp

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
TEMPLATE = app
TARGET = main
QT += widgets
SOURCES += main.cpp

构建和运行

代码语言:javascript
运行
复制
qmake && make && ./main
票数 4
EN

Stack Overflow用户

发布于 2014-12-22 17:54:39

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27607825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档