Qt多语言QCombobox

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt多语言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(),然后插槽会再次调用。

我怎么能避免这种情况?

答案

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 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);
另一答案

而不是清除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的答案将丢失comboBox中当前选定的项目。这个解决方案不应该失去它。 (未测试)

以上是关于Qt多语言QCombobox的主要内容,如果未能解决你的问题,请参考以下文章

QML程序实现动态切换多语言(ListModel/ListElement中的文本的多语言处理)

Qt跨平台(windowlinux)实现多语言

Qt系列文章之三十九(Qt多语言国际化程序实例设计实现)

Qt系列文章之三十九(Qt多语言国际化程序实例设计实现)

请教QT中多语言切换,lupdate提取字符串不成功的问题

如何使用 QML (Qt5.3) for Windows 8.1 RT 创建多语言应用程序?