を使用してアプリケーションに翻訳を追加すると、以下qApp->installTranslator(& aTranslator)のすべての呼び出し(および同様の関数)が翻訳者で翻訳されたテキストを検索します。したがって、後に呼び出す必要があります。実際には、そこで呼び出さないイベントが発生する可能性があります。イベントを再実装してインターセプトする可能性があります。QObject::tr()retranslateUi() qApp->installTranslator()QWidget::changeEvent()QEvent::LanguageChange
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
// Someone called qApp->installTranslator() with a new translation.
// Let's update the user visible strings.
// This function was created by uic from the Designer form.
// It translates all user visible texts in the form.
ui->retranslateUi(this);
// This function must be written by you. It translates other user visible
// texts that are not in the form. See down for an example.
this->retranslateUi();
break;
default:
break;
}
}
ui->retranslateUi()QObject::tr()UIで表示される各ユーザーの文字列を呼び出すだけです。これは最後に自動的に呼び出されsetupUi()、フォームのウィジェットに翻訳されたテキストを入力します(見てください。ファイル内のuicによって定義されていui_MainWindow.hます)。QTableWidgetのタイトルなど、他のユーザーに表示されるテキストでも同様のアプローチをとることができます。すべての文字列はretranslateUi()、アプリケーションの開始時(または、関連するウィジェットが作成された後)および新しい翻訳がロードされるたびに呼び出される関数(おそらく一貫性のために名前が付けられています)に設定されます。
MainWindow::MainWindow(QWidget * parent)
: QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Creates other widgets, but do not set their user visible texts.
tableWidget = new QTableWidget(this);
...
someControl = new QLineEdit(this);
someOtherControl = new QSpinBox(this);
someModel = new MyModel(this);
...
// Ok, *now* we set their texts.
this->retranslateUi();
}
...
void MainWindow::retranslateUi()
{
// This function will be called (either manually or automatically by
// `changeEvent()`) when a new translator has installed, hence all the `tr()`
// calls will return the right translation for the last installed language.
QStringList labels;
labels.append(tr("First column"));
labels.append(tr("Second column"));
labels.append(tr("Third column"));
tableWidget->setHorizontalHeaderLabels(labels);
someControl->setText(tr("Control name"));
someOtherControl->setText(tr("Other control name"));
// Perhaps you have a model that need to be retranslated too
// (you need to write its `retranslateUi()` function):
someModel->retranslateUi();
...
}
また、あなたが次のようなことをしている場合は注意してください
void MainWindow::someFunction()
{
...
QTranslator translator;
translator.load(":/lang/English");
qApp->installTranslator(& translator);
...
}
その関数が戻るとすぐに変数translatorが破棄されるため、次回QObject::tr()が呼び出されると、に格納されているアドレスはqApp->installTranslator(& translator)無効になります。したがってtranslator、でヒープに割り当てる必要があります(さらに、不要になったときにnewで削除することもできます)。delete例外は、その関数がブロックされており、アプリケーションが閉じられるまで戻らないため、main()呼び出す前にそれを実行している場合です。QCoreApplication::exec()
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
...
QTranslator translator;
translator.load(":/lang/English");
app.installTranslator(& translator);
...
app.exec(); // This function will return only on application's exit.
// Hence `translator` will outlive the application, there is
// no need to worry about it.
}