3

Qt言語学者と一緒にQtアプリケーションの多言語を作成しようとしています。このコードをメインウィンドウの関数に配置します。

translator.load(":/lang/English");
qApp->installTranslator(&translator);
ui->retranslateUi(this);

MainWindow.hでQTranslatorを宣言し、翻訳したいすべての文字列をtr()で囲みます。しかし、それでは、MainWindow.cppのコードによって動的に追加されたすべてのQObject(たとえば、QTableWidgetのタイトル)は変換されません。main.cppに他の翻訳者を配置すると、すべての文字列が翻訳されますが、アプリケーションで言語ボタンを作成する必要があるため、main.cppに翻訳者を配置できません。

あなたは私を助けるためのアイデアがありますか?

あなたの答えのためのThx。

ガット

4

1 に答える 1

5

を使用してアプリケーションに翻訳を追加すると、以下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.
}
于 2012-07-23T14:49:33.927 に答える