我已使用本教程向我的 qt/qml 应用程序添加了翻译
https://retifrav.github.io/blog/2017/01/04/translating-qml-app/ https://github.com/retifrav/translating-qml
大多数似乎都工作得很好,除了组合框的值不会通过动态翻译进行更新。 我使用的是 qt 5.11.2。
我所说的组合框是指:
ComboBox {
textRole: "text"
Layout.fillWidth: true
model: ListModel {
Component.onCompleted: {
append({text: qsTr("None")})
append({text: qsTr("Subpanel")})
append({text: qsTr("All")})
}
}
}
ComboBox {
textRole: "text"
Layout.fillWidth: true
model: ListModel {
ListElement{text: qsTr("None")}
ListElement{text: qsTr("Subpanel")}
ListElement{text: qsTr("All")}
}
}
它们都没有更新。 我做了一些研究并在错误报告中发现了这一点 https://bugreports.qt.io/browse/QTBUG-68350 这似乎在 5.12 上得到了修复,但由于各种原因我们需要保持相同的版本,有没有办法可以修复这个版本? (5.11.2)
编辑:我找不到翻译组合框的方法。还有其他翻译方法吗?即使这意味着打开应用程序的新实例?有人可以给我指一个链接吗?找不到方法来做到这一点。
EDIT2:有没有办法强制通过 JavaScript 更新组合框的模型?当调用changeLanguage()方法时?
注意:作为投诉,我发现支持/社区来获取 Qt 问题的答案非常糟糕,非常糟糕,但也许这是我的问题。
最佳答案
一种选择是添加一个执行翻译的QAbstracstListModel
。我给自己做了一个基类,可以继承。这还为您提供了很大的灵活性,可以将所选项目转换为值(在本例中我使用 int,但您可以将其设置为任何值),该值连接到 C++ 后端(我使用 backend.selectedPanel
为您的示例)
<< 编辑:请参阅 Felix 的回答,了解动态翻译的良好添加>>
基本 header :
class baseEnum : public QAbstractListModel
{
Q_OBJECT
public:
virtual int rowCount(const QModelIndex &parent) const = 0;
virtual QVariant data(const QModelIndex &index, int role) const = 0;
QHash<int, QByteArray> roleNames() const;
Q_INVOKABLE int getIndex(int value);
Q_INVOKABLE int getValue(int index);
}
基本cpp:
QHash<int, QByteArray> baseEnum::roleNames() const
{
QHash<int, QByteArray> result;
result.insert(Qt::DisplayRole, "text");
result.insert(Qt::UserRole + 1, "value");
return result;
}
int baseEnum::getIndex(int value)
{
for(int i=0;i<rowCount(QModelIndex());++i)
if(data(createIndex(i, 0, nullptr), Qt::UserRole + 1).toInt() == value)
return i;
return -1;
}
int baseEnum::getValue(int index)
{
return data(createIndex(index, 0, nullptr), Qt::UserRole + 1).toInt();
}
派生 header :
class FancyEnum : public baseEnum
{
Q_OBJECT
public:
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
};
派生的cpp:
int FancyEnum::rowCount(const QModelIndex &parent) const
{
if(!parent.isValid())
return 5;
return 0;
}
QVariant FancyEnum::data(const QModelIndex &index, int role) const
{
switch(index.row())
{
case 0: return role == Qt::DisplayRole ? QVariant(tr("None")) : QVariant(0);
case 1: return role == Qt::DisplayRole ? QVariant(tr("Subpanel")) : QVariant(1);
case 2: return role == Qt::DisplayRole ? QVariant(tr("All")) : QVariant(2);
}
return role == Qt::DisplayRole ? QVariant(QString("<%1>").arg(index.row())) : QVariant(0);
}
在某处注册:
qmlRegisterType<FancyEnum>("your.path.here", 1, 0, "FancyEnum");
QML 中的用法:
ComboBox {
model: FancyEnum { id: myEnum }
textRole: "text"
currentIndex: myEnum.getIndex(backend.selectedPanel) : 0
onActivated: backend.selectedPanel = myEnum.getValue(index) }
}
关于qt - 组合框qml的动态翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53277684/