qt - 组合框qml的动态翻译

标签 qt qml

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

相关文章:

c++ - QT 小部件与 QT GUI

python - 如何在 Mac 上创建独立的 Python Qt 应用程序

c++ - 在 Qt 中将一个小部件置于另一个小部件的中心

qt - 如何在 QtWebEngine QML 应用程序中设置用户代理

c++ - QML/OSM。如何显示圆圈?

Qt:屏幕截图

c++ -//! [0] Qt源码中

qt - 如何在 QML ScrollView(或 TextArea)中禁用滚动

python - 无法从 pyside 应用程序中的 qtquick2plugin.dll 中提取插件元数据

qt - QML:下方带有图像和文本的按钮