2016-08-13 8 views
5

मैं एक क्यूटी परियोजना पर काम कर रहा हूं जिसमें QMainWindow और एकाधिक क्यूटी और गैर-क्यूटी कक्षाएं शामिल हैं। उनमें से कई Q12trings का उपयोग tr() के साथ करते हैं जिनका क्यूटी लिंगुइस्ट के साथ अनुवाद किया जाता है। भाषा परिवर्तन (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 अनुवाद करने के लिए है कि कर रहे हैं कई (58 QMainWindow अकेले में), और कई कार्यावधि में भर रहे हैं साथ ही, उपयोगकर्ता बातचीत के माध्यम से; ई। जी। नीचे 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 ओवरलोड संभव नहीं है)?

मैंने पढ़ लिया है एक और तरीका है इस विधि का उपयोग करने के लिए है कि वहाँ एक यूआई फार्म के साथ,:

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

लेकिन यह है कि मैं सभी विजेट अपने प्रोजेक्ट है, जो मैं नहीं कर रहा हूँ में एक यूआई प्रपत्र का उपयोग कर रहा (शामिल कोड में बनाए गए हैं)। मैं एक यूआई के रूप में मेरी MainWindow निर्यात करने की कोशिश की, लेकिन जब मैं, मैं निम्न त्रुटि परियोजना में उत्पन्न हेडर को शामिल करने की कोशिश:

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

सबसे अच्छा तरीका चयन करने के लिए किसी भी सुझाव के लिए अग्रिम द्वारा धन्यवाद मेरे आवेदन का अनुवाद करने के लिए।

उत्तर

2

अपना कोड व्यवस्थित करें ताकि प्रत्येक वर्ग में एक विधि में अनुवादनीय तारों की सभी सेटिंग की जा सके।

उदाहरण के लिए प्रत्येक वर्ग को अनुवाद करने योग्य तार सेट्स() विधि है जो वास्तव में स्ट्रिंग सेट करता है।

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

इसके बाद जब भी() जैसे एक मेनू प्रविष्टि चयन करने के लिए कनेक्ट, या MainWindow :: घटना (या तथापि आवश्यक भाषा बदल सकते हैं) आवेदन परिवर्तन के लिए भाषा का, आपके पास मैन्युअल रूप से प्रत्येक के setTrs विधि कॉल करने के इन वस्तुओं में से

जैसे

void MainWindow::changeEvent(QEvent *event) 
{ 
    if (event->type() == QEvent::LanguageChange) 
    { 
     setTrs(); 
     objA.setTrs(); 
     objB.setTrs(); 
    } 
} 
इससे भी अधिक सुरुचिपूर्ण एक QList में वस्तुओं स्टोर करने के लिए और बस के माध्यम से बारीमें प्रत्येक तत्व पर setTrs विधि बुला पुनरावृति होगी
+2

यह वास्तव में क्यूटी डिजाइनर द्वारा उत्पन्न कोड को भी काम करता है। फ़ंक्शन का नाम अलग है ('retranslateUi') लेकिन यह वही काम करता है। –

संबंधित मुद्दे