1
void MyGlWidget::initializeGL() {
    try {
        throw std::exception();
    } catch(...) {        
        QMessageBox::critical(this, tr("Exception"), 
            tr("Exception occured"));
    }    
}

catch()でメッセージボックスが表示され、実行が再びinitializeGL()に入り、2番目のメッセージボックスが表示されます

私はbool変数を介してこれを回避しようとしています:

void MyGlWidget::initializeGL() {
    if(in_initializeGL_)
        return;
    in_initializeGL_ = true;

    try {
        throw std::exception();
    } catch(...) {        
        QMessageBox::critical(this, tr("Exception"), 
        tr("Exception occured"));
    }

    in_initializeGL_ = false;
}

しかし、これはクラッシュにつながります。そこで、paintGL()でエラーを表示することにしました(2つのメッセージボックスも表示されます):

void MyGlWidget::paintGL() {
    if(in_paintGL_)
        return;
    in_paintGL_ = true;

    if (!exception_msg_.isEmpty()) {
        QMessageBox::critical(this, tr("Exception"), 
            exception_msg_);
        exception_msg_.clear();
    }

    // rendering stuff 

    in_paintGL_ = false;
}

void MyGlWidget::initializeGL() {
    try {
        throw std::exception();            
    } catch(...) {        
        exception_msg_ = "Exception in initializeGL()";
    }
}

これは問題を解決しますが、コードは醜いです。この問題のより良い解決策はありますか?

Qt4.7 VS2008

4

1 に答える 1

1

解決策は次のとおりです:http: //labs.qt.nokia.com/2010/02/23/unpredictable-exec/

void MyGlWidget::initializeGL() {
    try {
        throw std::exception();        
    } catch(...) {        
        getExceptionMessage(&exception_msg_);
        QMessageBox *msgbox = new QMessageBox(QMessageBox::Warning, 
                                              "Exception", 
                                              exception_msg_, 
                                              QMessageBox::Ok, 
                                              this);
        msgbox->open(0, 0);
    }
}
于 2010-11-28T20:11:04.497 に答える