簡體   English   中英

用於C ++和QML的對象順序創建QT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM