2016-08-13 10 views
5

私はQMainWindowと複数のQtクラスとQt以外のクラスで構成されるQtプロジェクトに取り組んでいます。それらの多くはQt Linguistで翻訳されたtr()のQStringsを使用しています。言語の変更(QTranslatorのロード&のインストール/ QTranslatorのロード&の削除)は、アプリケーションのメニューのQActionsによってトリガーされます。メニューからアプリケーション内のすべてのウィジェットを動的に再変換する方法はありますか?

私はthe official Qt documentation concerning dynamic translationを読んでいると、それは基本的に以下の過負荷を示唆:

void MainWindow::changeEvent(QEvent *event) 
{ 
    if (event->type() == QEvent::LanguageChange) { 
     titleLabel->setText(tr("Document Title")); 
     ... // all my tr() QStrings here 
     okPushButton->setText(tr("&OK")); 
    } else 
     QWidget::changeEvent(event); 
} 

私が直面しています問題は、変換するQStringsは(単独QMainWindow 58)多くあるということです、そしていくつかは、実行時に満たされています同様に、ユーザインタラクションを通じて、 e。 g。 myFunction(a,b)は、以下のQPushButtonを通じて呼び出されます。

void MainWindow::myFunction(MyClassA a, MyClassB b) 
      { 
      ... 
      if(b.myCondition() == 0) 
       { 
       ... 
       // below is the problem 
       myLabel->setText(myLabel->text() + QString("\n" + a->getName() + tr(" gagne ") + exp + tr(" points d'expérience"))); 
       } 
      else 
      { 
       myLabel->setText(QString(tr("something else"))); 
      } 
      ... 
      } 

だから私はほとんど私が上記changeEvent()方法でQStringのこのタイプを含めることができる方法を見ていません。 MainWindow以外のクラスについては、QStringsも翻訳されますが、QWidgetではありません(したがって、changeEventのオーバーロードはありません)。

私は、UIのフォームで、この方法を使用する別の方法があることを読みました:

void MainWindow::changeEvent(QEvent* event) 
{ 
    if (event->type() == QEvent::LanguageChange) 
    { 
     ui.retranslateUi(this); 
    } 
... 
} 

しかし、これは私が(私はやっていないのです私のプロジェクト内のすべてのウィジェットをUIのフォームを使用していますことを必要としますコードで作成されます)。 私はUIの形で私のメインウィンドウを輸出しようとしたが、私はプロジェクトに生成されたヘッダを含めるようにしようとすると、私は次のエラーを取得する:

ui_fenetreprincipale.h:32: error: qmainwindowlayout.h: No such file or directory 

は、最善の方法を選択するための任意の提案を事前によっていただきありがとうございます私のアプリケーションを翻訳する。

答えて

2

翻訳可能な文字列のすべての設定が各クラスの1つのメソッドで行われるようにコードを整理します。

たとえば、翻訳可能な文字列を持つすべてのクラスに、実際に文字列を設定するsetTrs()メソッドを与えます。

class A 
{ 
    void setTrs() 
    { 
    okPushButton->setText(tr("&OK"));  
    } 
} 
//-------------- 
class B 
{ 
    int _trCond; 
    void myFunction(MyClassA a, MyClassB b) 
    { 
     _trCond = b.myCondition(); 
     setTrs(); 
    } 

    void setTrs() 
    { 
     if(_trCond == 0) 
      myLabel->setText(myLabel->text() + QString("\n" + a->getName() + tr(" gagne ") + exp + tr(" points d'expérience"))); 
     else 
      myLabel->setText(QString(tr("something else"))); 
    } 

次に、アプリケーションの変更(例えば、メニュー項目の選択に接続する、またはメインウィンドウ::イベント()またはただし、必要な言語を変更することができます)の言語は、あなたが手動で各のsetTrsメソッドを呼び出す必要がありたびこれらのオブジェクトの

例えば

void MainWindow::changeEvent(QEvent *event) 
{ 
    if (event->type() == QEvent::LanguageChange) 
    { 
     setTrs(); 
     objA.setTrs(); 
     objB.setTrs(); 
    } 
} 

はさらにエレガントはQListの中でオブジェクトを格納し、それは順番に各要素にsetTrsメソッドを呼び出すことを反復処理することです

+2

これは実際にQt Designerで生成されたコードの動作です。関数名は異なっていますが( 'retranslateUi')、同じことをします。 –

関連する問題