1

私は自分では解決できない本当に奇妙な行動に苦しんでいるので、ここにいます。

うまく機能するコンソールアプリケーション用のGUIを作成しています。ユーザーは、ロードするファイルを選択するか、前に選択したファイルをリロードすることができます。これらの2つのアクションは、2つの異なるで処理されますslots。私はファイルの形式でエラーを処理してexceptionsおり、コンソールバージョンではうまく機能しましたが、GUIの場合は今のところあまりうまく機能していません...

openFileでエラーがスローされるslotと、catchブロックは機能し、メソッドは期待どおりに停止しますが、他のスロットが予期せず呼び出されます。理由がわからないので、その動作を修正する方法がわかりません。

関連するコードは次のとおりです。

void Loader::openSourceFile()
{
    fileName = QFileDialog::getOpenFileName(myWindow, tr("Select source file"), QString(), tr("Text files (*.txt)"));
    try{
        parseSourceFile();
    } catch(MyException &e)
    {
        QString msg = QString(e.what());
        myWindow->alertUser(msg);
        return;
    }
}

void Loader::reloadSourceFile()
{
    try{
        parseSourceFile();
    } catch(MyException &e)
    {
        QString msg = QString(e.what());
        myWindow->alertUser(msg);
        return;
    }
}

使用のコンテキスト:

myLoader = new Loader(this);
menuTop = menuBar()->addMenu(tr("&File"));

//open source file
openAction = new QAction(QIcon(":images/document.png"), tr("&Open"), this);
connect(openAction, SIGNAL(triggered()), myLoader, SLOT(openSourceFile()));
menuTop->addAction(openAction);

//reload source file
reloadAction = new QAction(QIcon(":images/reload.png"), tr("&Reload"), this);
connect(openAction, SIGNAL(triggered()), myLoader, SLOT(reloadSourceFile()));
menuTop->addAction(reloadAction);

注:大量のデバッグを行った後、catchブロックの実行後に、そのクラスのmocファイル内の1つの関数が呼び出されていることがわかりました。

void Loader::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    if (_c == QMetaObject::InvokeMetaMethod) {
        Q_ASSERT(staticMetaObject.cast(_o));
        Loader *_t = static_cast<Loader *>(_o);
        switch (_id) {
        case 0: _t->openSourceFile(); break;
        case 1: _t->reloadSourceFile(); break;
        default: ;
        }
    }
    Q_UNUSED(_a);
}

_id = 1で呼び出され、他のスロットの望ましくない実行を説明します。しかし、なぜこれが起こるのですか?誰かがこれを回避する方法を説明できますか?私はすでに独自のアプリケーションクラスを派生させqApplicationてオーバーライドnotify()しましたが、それは何も変更しません。

4

1 に答える 1

2

したほうがいい:

reloadAction = new QAction(QIcon(":images/reload.png"), tr("&Reload"), this);
connect(openAction, SIGNAL(triggered()), myLoader, SLOT(reloadSourceFile()));
menuTop->addAction(reloadAction);

なれ:

reloadAction = new QAction(QIcon(":images/reload.png"), tr("&Reload"), this);
connect(reloadAction, SIGNAL(triggered()), myLoader, SLOT(reloadSourceFile()));
//      ^^^^^^^^^^^^
menuTop->addAction(reloadAction);
于 2012-09-25T02:35:04.450 に答える