2016-11-30 42 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