Qt 如何更改为在QML中的选项卡栏上动态添加的选项卡按钮

Qt 如何更改为在QML中的选项卡栏上动态添加的选项卡按钮,qt,qml,Qt,Qml,假设我们使用qmljavascript添加一些TabButton,行为tabBar.addItem,参数为TabButton.createObject 现在我要做的是,如果我更改语言,我希望TabButton的文本也更改 如何做到这一点 我知道我可以在组件上(我已经在一个真正的应用程序上)对一个C++类进行一个连接(它对一个信号做出反应),在这里我们加载了这样的翻译< /p> Connections { target: qmlTranslator onLanguageChange

假设我们使用
qml
javascript添加一些
TabButton
,行为
tabBar.addItem
,参数为
TabButton.createObject

现在我要做的是,如果我更改语言,我希望
TabButton
的文本也更改

如何做到这一点

<>我知道我可以在组件上(我已经在一个真正的应用程序上)对一个C++类进行一个连接(它对一个信号做出反应),在这里我们加载了这样的翻译< /p>
Connections {
    target: qmlTranslator
    onLanguageChanged: {
      doSomething()
    }
}
我没办法让它和这个按钮一起工作。我提供了一个简单的代码来说明我所拥有的:

import QtQuick 2.7
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.3
import QtQuick.Window 2.3

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Tabbars")

    function assertCDataTabs () {
        var tabs = ["Config", "Devices", "IOs", "Sounders", "Zones"]
        for (var t in tabs) {
                    tabBar.addItem(tabButton.createObject(tabBar, { text: QT_TRANSLATE_NOOP("main",t), "font.pixelSize": 14  }))
        }
        backgroundHome.visible=false;
    }

    header: TabBar {
        id: tabBar
        opacity:0.8
    }

    Component {
        id: tabButton
        TabButton {
            font.pixelSize: 14
        }
    }

    StackLayout {
        id: content
        currentIndex: tabBar.currentIndex
        anchors.fill: parent
    }

    Component.onCompleted: {
        assertCDataTabs()
    }
}
编辑: 为什么这不起作用

Connections {
    target: qmlTranslator
    onLanguageChanged: {
        var _contentData = tabBar.contentData
        if(_contentData.length > 0){
            for(var i=0;i<_contentData.length;i++){
                var textTrans = _contentData[i]['contentItem']['text']
                tabBar.itemAt(i).text = qsTr(textTrans)
            }
        }
        }
    }

在这些情况下,您必须使用带有QT_TR_NOOP的模型(例如ListModel),如所示,并且要将TabButton添加到TabBar,需要使用中继器

在本例中,我使用了3种翻译:

translations
 ├── Lang-de.qm
 ├── Lang-en.qm
 └── Lang-es.qm
考虑到上述情况,解决方案如下:

translator.cpp

#include "translator.h"
#include <QGuiApplication>
#include <QDirIterator>
#include <QSettings>

Translator::Translator(QQmlEngine *engine, QObject *parent) :
    QObject(parent),
    m_engine(engine)
{
    m_translator = new QTranslator(this);
    m_dir = QDir(":translations");
    m_languages.clear();
    for(QString entry : m_dir.entryList()){
        entry.remove(0, QString("Lang-").length());
        entry.chop(extension.length());
        m_languages.append(entry);
    }
    emit languagesChanged();
    QSettings settings;
    QString lang =settings.value("Language/current", QLocale::system().bcp47Name()).toString();
    selectLanguage(lang);
}

QStringList Translator::languages() const
{
    return m_languages;
}

QString Translator::currentLanguage() const
{
    return m_currentLanguage;
}

QString Translator::languageByCode(const QString &code)
{
    QLocale lo(code);
    return QLocale::languageToString(lo.language());
}

void Translator::selectLanguage(const QString &language)
{
    qApp->removeTranslator(m_translator);
    if(m_languages.contains(language)){
        QString file = QString("Lang-%1%2").arg(language).arg(extension);
        if(m_translator->load(m_dir.absoluteFilePath(file))){
           m_currentLanguage = language;
           QSettings settings;
           settings.setValue("Language/current", language);
           emit currentLanguageChanged();
        }
    }
    qApp->installTranslator(m_translator);
    m_engine->retranslate();
    emit languageChanged();
}

您找到的完整示例。

关于您的编辑:(1)什么是
选项卡
?(2) 它怎么不起作用?有错误消息吗?@TrebuchetMS sry这是一个错误的复制粘贴。它是id为:tabBar的组件。当我的意思是它不工作时,它不能用动态变化的语言进行翻译。当我从一个类发出一个信号,在这个类中我执行
translation.load
,这种连接就会发生。在这种情况下,qsTr会nothing@TrebuchetMS我再加上classes@Nmaster88我在主窗口
property var tabsText:[QT_TR_NOOP(“配置”)、QT_TR_NOOP(“设备”)、QT_TR_NOOP(“i/O组”)、QT_TR_NOOP(“发声器组”)、QT_TR_NOOP(“分区”)中使用了一个属性,而不是封装ListModel组件
但您的解决方案似乎不错!
QQmlApplicationEngine engine;
QmlTranslator qmlTranslator(&engine);
// and register it as a context in Qml layer
engine.rootContext()->setContextProperty("qmlTranslator", &qmlTranslator);
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
translations
 ├── Lang-de.qm
 ├── Lang-en.qm
 └── Lang-es.qm
#include "translator.h"
#include <QGuiApplication>
#include <QDirIterator>
#include <QSettings>

Translator::Translator(QQmlEngine *engine, QObject *parent) :
    QObject(parent),
    m_engine(engine)
{
    m_translator = new QTranslator(this);
    m_dir = QDir(":translations");
    m_languages.clear();
    for(QString entry : m_dir.entryList()){
        entry.remove(0, QString("Lang-").length());
        entry.chop(extension.length());
        m_languages.append(entry);
    }
    emit languagesChanged();
    QSettings settings;
    QString lang =settings.value("Language/current", QLocale::system().bcp47Name()).toString();
    selectLanguage(lang);
}

QStringList Translator::languages() const
{
    return m_languages;
}

QString Translator::currentLanguage() const
{
    return m_currentLanguage;
}

QString Translator::languageByCode(const QString &code)
{
    QLocale lo(code);
    return QLocale::languageToString(lo.language());
}

void Translator::selectLanguage(const QString &language)
{
    qApp->removeTranslator(m_translator);
    if(m_languages.contains(language)){
        QString file = QString("Lang-%1%2").arg(language).arg(extension);
        if(m_translator->load(m_dir.absoluteFilePath(file))){
           m_currentLanguage = language;
           QSettings settings;
           settings.setValue("Language/current", language);
           emit currentLanguageChanged();
        }
    }
    qApp->installTranslator(m_translator);
    m_engine->retranslate();
    emit languageChanged();
}
import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
import QtQuick.Window 2.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: "tabBars"
    ListModel{
        id: tabmodel
    }
    function assertCDataTabs(){
        var tabs = [QT_TR_NOOP("Configuration"),
                    QT_TR_NOOP("Devices"),
                    QT_TR_NOOP("Sounders"),
                    QT_TR_NOOP("Zones")]
        for (var i in tabs)
            tabmodel.append({"text": tabs[i] })
    }
    header: TabBar{
        id: tabBar
        opacity:0.8
        Repeater{
            model: tabmodel
            TabButton{
                text: qsTr(tabmodel.get(index).text)
                font.pixelSize: 14
            }
        }
    }
    Column {
        width: parent.width * 0.95
        spacing: 15
        padding: 15
        RowLayout {
            anchors.horizontalCenter: parent.horizontalCenter
            Repeater{
                model: trans.languages
                Button{
                    id: btn
                    property string code: modelData
                    text: trans.languageByCode(code)
                    onClicked: trans.selectLanguage(btn.code)
                    Layout.preferredWidth: 100
                    Layout.preferredHeight: 50
                    highlighted: code == trans.currentLanguage
                }
            }
        }
    }
    Component.onCompleted: assertCDataTabs()
}