私は自分では解決できない本当に奇妙な行動に苦しんでいるので、ここにいます。
うまく機能するコンソールアプリケーション用の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()
しましたが、それは何も変更しません。