<< QT && C++ トップ

QDialog::exec: Recursive call detectedの発生原因

QDialogを継承したダイアログクラスでexec関数を呼び出したときに次のようなエラーが発生する場合があります。

QDialog::exec: Recursive call detected

これはダイアログがすでにexecで表示済みなのにさらにexecでダイアログを表示しようとしたときに発生します。たとえば次のようなコードです。

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMessageBox* dialog = new QMessageBox();
    dialog.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
        //SavaボタンとCancelボタンを設置
    dialog.setText("1回目のダイアログ表示");
        //ダイアログのメッセージ

    int ret = dialog.exec();
    switch(ret){
    case QMessageBox::Save:
        //Saveの処理
        break;
    case QMessageBox::Cancel:
        break;
    }
    
    dialog.setText("2回目のダイアログ表示");
    dialog.exec();

    return app.exec();
}

この例のようにexecを実行した後に、同じダイアログインスタンスでもう一度execを実行しようとしてもすでに実行済みなので違うボタンがクリックされたとしても1回目と同じ結果が返ってきてしまいます。

このようなことを防ぐためにはダイアログを表示するたびにインスタンスを作ったほうが確実なようです。

関連項目
プライバシーポリシー