Qt Multi language QCombobox



我遇到了多语言qt(动态更改语言)的问题。我的表格有一个组合框,当语言发生变化时应该翻译。当languageChanged时,应用程序调用方法retranslateUi()来翻译组合框中的项。组合框具有对应于信号currentIndexChanged()的插槽。

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(),然后slot会再次调用。

我该如何避免这种情况?

另一个解决方案是临时阻止对象的信号:

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

clear()insertItems()将触发组合框的currentIndexchanged(int) SLOT函数,因为前者将索引更改为-1,而后者也将在位置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;
}

您只能通过void QComboBox::setItemText(int index, const QString &text) 更改项目的文本,而不能清除comboBox

void retranslateUi()
{
    ui->comboBox->setItemText(0, QApplication::translate("SettingDialog", "English", 0, QApplication::UnicodeUTF8));
    ui->comboBox->setItemText(1, QApplication::translate("SettingDialog", "French", 0, QApplication::UnicodeUTF8));
}

我假设您的解决方案和ScarCode的答案将丢失组合框中当前选定的项目。这个解决方案不应该丢失它。(未测试)

最新更新