2012-07-31 107 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);