15

Qt アプリケーションで例外を処理しようとしています。Qt で効率的な方法で例外を処理するために QApplication::notify メソッドをオーバーライドすることを示すいくつかの投稿を行いました。このオーバーライドされたメソッドをどこに追加すればよいかわかりません。それは 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 オブジェクトのメソッドです。通知メソッドをオーバーライドするには、継承する必要があり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++ は仮想静的メソッドをサポートしていないため、とにかく静的メソッドにすることはできません (悲しいことに、それは別のトピックです)。

したがって、私は個人的に次のようなことをします:

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
于 2014-12-22T18:02:37.120 に答える