gpt4 book ai didi

qt - 组合框qml的动态翻译

转载 作者:行者123 更新时间:2023-12-04 15:10:07 24 4
gpt4 key购买 nike

我已使用本教程向我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com