1
我一直在努力與一個非常奇怪的行爲,我不能自己解決,所以我在這裏。奇怪的行爲與例外(某些方法未被調用執行)
我正在創建一個很棒的控制檯應用程序的GUI。用戶可以選擇要加載的文件或重新加載先前選擇的文件。這兩種行爲都由兩種不同的slots
來處理。我在處理文件的格式錯誤與exceptions
並在控制檯版本偉大的工作,但對於GUI不算太出色的那一刻...
當錯誤在中openFile slot
拋出,catch
塊使他的工作,並按預期的方法停止,但另一個插槽意外調用。我不知道爲什麼,所以不知道如何糾正這種行爲。
下面是相關代碼:
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);
注:
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;
}
}
的環境下使用重型調試完畢後,我發現,在該類的MOC文件中的一個功能被稱爲後catch塊的執行:
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,它解釋了你n希望執行另一個插槽。但爲什麼發生這種情況有人可以解釋如何避免這種情況嗎?我已經創建了自己的應用程序類,從qApplication
派生並覆蓋notify()
,但這並不會改變任何內容。
啊,我愛你!感謝您指出我愚蠢的複製/粘貼錯誤,這讓我失去了好幾個小時...... – Ote
@Ote--發生在我們所有人身上。當我有一些愚蠢的事情發生時,我通常會要求同事閱讀代碼。 –
我希望我可以:我正在從我家做一名自由職業者... – Ote