2012-07-31 104 views
0

我遇到了多語言qt(即時更改語言)的問題。我的表單有一個組合框,應該在語言改變時進行翻譯。當languageChanged時,應用程序調用方法retranslateUi()來轉換組合框中的項目。組合框具有對應於信號currentIndexChanged()的插槽。Qt多語言QCombobox

void on_comboBox_currentIndexChanged(int index) 
{ 
//do something 
} 

但當方法retranslateUi()調用,我這樣做:

void retranslateUi() 
{ 
ui->comboBox->clear(); 
ui->comboBox->insertItems(0, QStringList() 
     << QApplication::translate("SettingDialog", "English", 0, QApplication::UnicodeUTF8) 
     << QApplication::translate("SettingDialog", "French", 0, QApplication::UnicodeUTF8) 
     ); 
} 

問題是:在retranslateUi()每個語句會發出信號currentIndexChanged(),那麼廣告位會再打電話。

我該如何避免這種情況?

回答

1

clear()insertItems()將觸發組合框作爲前者的變化指數爲-1的currentIndexchanged(int) SLOT功能,後來也將改變索引,你是在位置插入項目0

因此,通過使用一個標誌限制on_comboBox_currentIndexChanged(int)如下...

void on_comboBox_currentIndexChanged(int index) 
{ 
if(!retranslateFlag) 
//do something 
} 


void retranslateUi() 
{ 
retranslateFlag = true; 
ui->comboBox->clear(); 
ui->comboBox->insertItems(0, QStringList() 
    << QApplication::translate("SettingDialog", "English", 0, QApplication::UnicodeUTF8) 
    << QApplication::translate("SettingDialog", "French", 0, QApplication::UnicodeUTF8) 
retranslateFlag = false; 
    ); 
} 
+0

非常感謝。我試過了,一切都很好 – PhiVH 2012-07-31 12:42:31

0

另一個解決方案是臨時塊信號爲對象:

void retranslateUi() 
{ 
    auto isBlocked = ui->comboBox->blockSignals(true); 
    ui->comboBox->clear(); 
    ui->comboBox->insertItems(0, QStringList() 
    << QApplication::translate("SettingDialog", "English", 0, QApplication::UnicodeUTF8) 
    << QApplication::translate("SettingDialog", "French", 0, QApplication::UnicodeUTF8); 
    ); 
    ui->comboBox->blockSignals(isBlocked); 
} 

或自Qt 5.3使用異常安全RAII QSignalBlocker

QSignalBlocker blocker(ui->comboBox);