2016-11-30 43 views
1

我具有其中轉換器被以通常的方式成功安裝的應用程序:TR()函數不工作了遷移從Qt的4至Qt的5

bool bSuccess = qApp->installTranslator(m_translator); 

m_translator是一個指針,指向從QTranslator派生的類。

當應用程序使用Qt 4.7.4編譯下面所有的說明做工精細:

  1. QString qTranslString = m_translator->translate("", "string_to_be_translated");
  2. QString qTranslString = QCoreApplication::translate("", "string_to_be_translated");
  3. QString qTranslString = tr("string_to_be_translated");

但當相同的應用,同一個項目設置,編譯爲Qt 5.2.1,在Windows或Linux上只能編號1正在工作。 另外兩個是不是要求的m_translator的翻譯方法。

這裏是用於再現該問題的最小例如:

minimalpbm.pro

greaterThan(QT_MAJOR_VERSION, 4) { 
    QT += widgets 
} 

TARGET = minimalpbm 
TEMPLATE = app 

SOURCES += main.cpp 
HEADERS += mytranslator.h 

mytranslator.h

#include <QTranslator> 

class MyTranslator : public QTranslator 
{ 
    Q_OBJECT 

public: 
    explicit MyTranslator(QObject *parent = 0); 
    ~MyTranslator(); 

    bool isEmpty() const; 
    QString translate(const char *context, const char *sourceText, const char *comment = 0) const; 

private: 
}; 

的main.cpp

#include <QApplication> 
#include <QMainWindow> 
#include "mytranslator.h" 

MyTranslator::MyTranslator(QObject *parent) : QTranslator(parent) 
{ 
} 

MyTranslator::~MyTranslator() 
{ 
} 

bool MyTranslator::isEmpty() const 
{ 
    return false; 
} 

QString MyTranslator::translate(const char* /*context*/, const char* sourceText, const char* /*comment*/) const 
{ 
    QString translation; 

    (void) sourceText; 

    translation = "Window Title";       // No matter what the source text is we return the same translation for test 

    return translation; 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication qA(argc, argv); 

    QMainWindow qW;           // Create main window 

    MyTranslator *m_translator = new MyTranslator(&qW);  // Install translator 
    qApp->installTranslator(m_translator); 

    qW.setWindowTitle(qW.tr("ST_TITLE"));     // Set title 
    qW.show();            // Show main window 

    return qA.exec();          // Main event loop 
} 

隨着Qt4的窗口標題是「窗口標題」, 與Qt5窗口標題是「ST_TITLE」。

任何提示? 非常感謝您提前!

+0

你得到任何編譯錯誤?你怎麼知道這個方法沒有被調用? –

+0

沒有編譯錯誤。我知道,因爲調試器在我的自定義'translate'('m_translator-> translate')函數中沒有中斷。 – mbjoe

+0

好,如果你能爲我們提供一個最小的例子來重現你的問題。否則,我們只能猜測。例如。你真的調用'app.installTranslator(m_translator)'? m_translator對象的範圍是什麼? – E4z9

回答

1

是否MyTranslator::translate仍然覆蓋一個QTranslator虛方法?在閱讀QT 5.2.0文檔時,您想要覆蓋的方法被刪除。我建議嘗試用4個參數而不是3來覆蓋翻譯方法,所以translate(const char *context, const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1) const。還要將override關鍵字放在它後面,以便編譯器會警告您這些問題。

+1

'override'在這種情況下甚至會編譯失敗,甚至比發出警告更好。 – rubenvb

+0

你說得對。當你回答時,我發現了同樣的事情。 ** Qt的4.7.4 ** has'virtual的QString \t翻譯(常量字符*上下文中,常量字符* sourceText,常量字符*消歧= 0)常量; 的QString \t翻譯(常量字符*上下文中,常量字符* sourceText,常量字符*消歧,INT n)的常量;',而** Qt的5.2。1 **只是'虛擬QString \t translate(const char * context,const char * sourceText,const char * disambiguation = 0,int n = -1)const;'所以在MyTranslator中爲Qt5使用這個函數可以解決問題。謝謝! – mbjoe