【问题标题】:Object order creation QT for C++ and QML用于 C++ 和 QML 的对象顺序创建 QT
【发布时间】: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 或至少与Translator w.r.t 相关。使用的linux发行版。一旦注册了上下文属性,就是这样,它应该始终有效。如果您想真正得到帮助,请向我们展示 Translator 课程。
  • 我更新了上面的代码
  • 您确定选择了翻译的默认后备吗?可能是译者把未翻译的文本弄乱了,这就解释了为什么你没有在任何地方看到问题。请同时提供标题...

标签: c++ qt qml qtquick2


【解决方案1】:

你需要检查问题出在translator还是tr

如果translator 尚未创建,您将在控制台中收到此错误:

ReferenceError: 未定义翻译器。

而且您不会在 Text 对象中看到 Weatherundefined

如果translator存在但tr不存在,那么translator.tr会返回undefined,所以调用qsTr("Weather") + translator.tr时会得到这个输出:

天气定义

我建议你调用一些 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
}

我还注意到您的翻译器对象是在堆栈上分配的,这也可能导致问题。

【讨论】:

  • 我尝试在堆中分配对象,仍然无法正常工作
  • @RamsésRamírez,console.log(translator) 的输出是什么?
  • @RamsésRamírez,我的意思是当你得到Weatherundefinedconsole.log(translator) 的输出是什么?
  • 很难看到调试,因为我的目标是开发板,出于某种原因,我添加:console.log(translator);控制台.log(translator.tr);文本似乎是空的,但是,我在 Windows 机器上对其进行了测试,我得到: qml: Translator(0x28fdc0) qml:
猜你喜欢
  • 2017-01-16
  • 2014-05-25
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2014-07-18
相关资源
最近更新 更多