0

我遇到了多语言 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(),然后插槽会再次调用。

我怎样才能避免这种情况?

4

3 回答 3

2

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

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);
于 2016-03-09T10:58:42.843 回答
1

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;
}
于 2012-07-31T11:11:37.317 回答
0

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

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 的答案将丢失组合框中的当前选定项目。此解决方案不应丢失它。(未测试)

于 2018-08-07T08:06:01.067 回答