我正在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对象,这会导致trundefined

这是我在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,您将在控制台中收到以下错误消息:



而且您在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
}

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

08-16 00:05