【发布时间】:2015-02-05 21:44:48
【问题描述】:
我正在 Linux 环境中使用 Qt/QML 开发应用程序。随着应用程序变得越来越大,出现了几个问题。
一个特定的问题与 QML 源代码中引用的 C++ 对象translator 有关。项目构建正确,translator 对象适用于 QML 中的几乎所有项目。但是,在某些地方,我得到了错误的文字。考虑以下示例:
Text{
x: 1036; y: 108
id: incomingLabel
text: qsTr("Weather") + translator.tr; // referred object
color: "white";
font.pixelSize: 34
}
如果我得到"WeatherUndefined" 作为文本,全部附加。我的猜测是,当这个 QML 文本元素需要 text 属性时,translator 对象尚未创建,这会导致 tr 成为 undefined。
这就是我在 QML 中注册 C++ 类的方式:
Translator translator(app.data(),":/translations");
viewer.rootContext()->setContextProperty("translator", &translator);
需要注意的是,这个问题并没有出现在Windows上,而只出现在我的Linux环境中。
翻译器类的完整代码为:
Yes translator.tr is a read only property. The translator code is:
#include "translator.h"
#include <QDebug>
Translator::Translator(QApplication *app, const QString &source, QObject *parent) :
QObject(parent),
m_app(app),
m_source(source)
{
addTranslation("DE", "lang_de_DE.qm");
addTranslation("ES", "lang_es_ES.qm");
addTranslation("FR", "lang_fr_FR.qm");
addTranslation("IT", "lang_it_IT.qm");
}
void Translator::addTranslation(const QString &name, const QString &file)
{
if (!m_translations.contains(name))
m_translations.insert(name, file);
}
QString Translator::tr()
{
return "";
}
void Translator::setSource(const QString &source)
{
m_source = source;
}
void Translator::translate(const QString &language)
{
if (language == "EN")
removeTranslation();
if (m_translations.contains(language))
{
QString langURL = m_translations.value(language).toString();
if (m_qtTranslator.load(langURL, m_source))
{
removeTranslation();
m_app->installTranslator(&m_qtTranslator);
emit languageChanged();
}
}
}
void Translator::removeTranslation()
{
m_app->removeTranslator(&m_qtTranslator);
emit languageChanged();
}
头文件:
#ifndef TRANSLATOR_H
#define TRANSLATOR_H
#include <QObject>
#include <QVariantMap>
#include <QtWidgets/QApplication>
#include <QTranslator>
class Translator : public QObject
{
Q_OBJECT
Q_PROPERTY(QString tr READ tr NOTIFY languageChanged)
public:
explicit Translator(QApplication *app, const QString &source, QObject *parent = 0);
void addTranslation(const QString &name, const QString &file);
void setSource(const QString &source);
Q_INVOKABLE void translate(const QString &language);
QString tr();
signals:
void languageChanged();
private:
QApplication *m_app;
QString m_source;
QVariantMap m_translations;
QTranslator m_qtTranslator;
void removeTranslation();
};
#endif // TRANSLATOR_H
有什么想法吗?提前谢谢你。
【问题讨论】:
-
在这种情况下,我会将
translator对象设为单例 -
Translator.tr是只读属性吗? -
问题出在
Translator或至少与Translatorw.r.t 相关。使用的linux发行版。一旦注册了上下文属性,就是这样,它应该始终有效。如果您想真正得到帮助,请向我们展示Translator课程。 -
我更新了上面的代码
-
您确定选择了翻译的默认后备吗?可能是译者把未翻译的文本弄乱了,这就解释了为什么你没有在任何地方看到问题。请同时提供标题...