[英]Object order creation QT for C++ and QML
我正在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
還是tr
。
如果尚未創建translator
器,您將在控制台中收到此錯誤:
ReferenceError:未定義轉換程序。
並且您不會在Text對象中看到Weatherundefined
。
如果translator
存在但不存在tr
,則translator.tr
將返回undefined
,因此在調用qsTr("Weather") + translator.tr
時將獲得此輸出:
Weatherundefined
我建議你調用一些console.log()來查明問題:
Text{
x: 1036; y: 108
id: incomingLabel
text: {
console.log(translator);
console.log(translator.tr);
return qsTr("Weather") + translator.tr(); // referred object
}
color: "white";
font.pixelSize: 34
}
另外我注意到你的翻譯器對象是在堆棧上分配的,這也可能導致問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.