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()
}