2013-08-29 51 views
0

這種情況是: 在「創建過程」中,我單擊「Save1」按鈕(時間1,它調用setUpStep2Action()),它進入第2步並禁用「Save1」按鈕...保存所有信息後,我添加更多課程,因此「Save1」按鈕啓用。當我點擊「Save1」按鈕(時間2),它調用setUpStep2Action()2次。 我不知道發生了什麼,以及如何防止此問題。 謝謝。如何防止QPushButton呼叫信號兩次?

無效step2SaveAction(INT courseId) {

int numElement = ui.rightWidget->count(); 
    if(numElement == 0) 
    { 
    QMessageBox::warning(this,tr("Skill choice"),tr("Please choose skills!!")); 
    return; 
    } 

    char* method = "CREATE"; 
if (courseId !=0) 
    method = "EDIT"; 

setup4Step3(method,courseId,numElement); 
ui.addMoreButton->setVisible(true); 

}

我把在構造函數中的連接。這裏是我的代碼中創建連接:

QSignalMapper *signalMapper1 = new QSignalMapper(this); 
    signalMapper1->setMapping(ui.courseNameLineEdit,0); 
    QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()),signalMapper1, SLOT(map())); 
    QObject::connect(signalMapper1, SIGNAL(mapped(int)),this, SLOT(step1SaveAction(int))); 
+1

您可能多次將'clicked()'信號連接到'setUpStep2Action()'插槽,但除非您發佈代碼,否則無法分辨。 –

+0

如何完成連接()功能.. – Wagmare

+0

是的。我沒有上傳代碼:)謝謝 – ndnguyen

回答

0

我非常贊同這裏的所有意見,你每次添加一個新的連接您點擊按鈕。你說你沒有。易於測試。有一個很好的,很少使用的連接選項:Qt :: UniqueConnection。

更改您的連接:

bool success = false; 
success = QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()), 
signalMapper1, SLOT(map()),Qt::UniqueConnection); 
if(!success){ 
    qFatal() << "Connection failed1"; 
} 
sucess = QObject::connect(signalMapper1, SIGNAL(mapped(int)),this, 
SLOT(step1SaveAction(int)),Qt::UniqueConnection); 
if(!success){ 
    qFatal() << "Connection failed2"; 
} 

如果你是正確的,你的程序繼續運行,我們要集思廣益更多。 :-)

Btw ...你沒有告訴我們關於按鈕的一些事情嗎?你連接一個LineEdit。但是,儘管如此,你的所有關係都要做上述事情。

+0

非常感謝,每次點擊「添加更多」,都會創建一個新的連接線,並且創建了它,你是對的,我爲它創建了2個連接,選項「Qt :: UniqueConnection」似乎工作不正常。我現在知道如何處理它。:) – ndnguyen

0

,張貼在從RA的評論,你可能連接clicked()信號到setUpStep2Action()插槽多次。我想這是因爲當你添加一個課程時,你會這樣做:

void addCourse() 
{ 
    // ... 
    save1Button->setEnabled(true); 
    connect(save1Button, SIGNAL(clicked()), 
      this,  SLOT(setUpStep2Action())); 
} 

因此,每次添加課程時都會添加一個連接。例如,你需要做的只是在包含按鈕的類的構造函數中調用connect一次。

然後僅此簡化您addCourse()方法:

void addCourse() 
{ 
    // ... 
    save1Button->setEnabled(true); 
} 
+0

我使信號函數外部的連接(在構造函數中)。而且我不再調用信號功能內部的連接。 :( – ndnguyen