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

または、Qt5.3以降は例外安全なRAIIQSignalBlockerを使用します

QSignalBlocker blocker(ui->comboBox);
于 2016-03-09T10:58:42.843 に答える
1

clear()前者がインデックスを-1に変更すると、コンボボックスinsertItems()のSLOT機能がトリガーcurrentIndexchanged(int) され、後で、位置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 に答える