我有一个应用程序,其中翻译器以通常的方式成功安装:
bool bSuccess = qApp->installTranslator(m_translator);
其中m_translator
是指向从QTranslator
派生的类的指针。
使用Qt 4.7.4编译应用程序时,以下所有说明都可以正常工作:
QString qTranslString = m_translator->translate("", "string_to_be_translated");
QString qTranslString = QCoreApplication::translate("", "string_to_be_translated");
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,窗口标题为“Window Title”, 使用Qt5,窗口标题为“ST_TITLE”。
任何提示? 非常感谢你提前!
答案 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
关键字放在后面,这样编译器就会警告您这些问题。