2012-09-25 96 views
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(),但這並不會改變任何內容。

回答

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); 
+0

啊,我愛你!感謝您指出我愚蠢的複製/粘貼錯誤,這讓我失去了好幾個小時...... – Ote

+0

@Ote--發生在我們所有人身上。當我有一些愚蠢的事情發生時,我通常會要求同事閱讀代碼。 –

+0

我希望我可以:我正在從我家做一名自由職業者... – Ote