tr()函数不再工作从Qt 4迁移到Qt 5

时间:2016-11-30 14:29:44

标签: c++ qt

我有一个应用程序,其中翻译器以通常的方式成功安装:

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");
  4. 但是,当使用 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,窗口标题为“Window Title”, 使用Qt5,窗口标题为“ST_TITLE”。

    任何提示? 非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

MyTranslator::translate是否仍覆盖QTranslator虚拟方法?在阅读QT 5.2.0文档时,删除了要覆盖的方法。我建议尝试使用4个参数而不是3来覆盖translate方法,因此translate(const char *context, const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1) const。同时将override关键字放在后面,这样编译器就会警告您这些问题。