翻译枚举值qt的字符串表示

Translate String Representation of Enum Values Qt

本文关键字:字符串 表示 qt 枚举 翻译      更新时间:2023-10-16

是否可以使用QT的翻译系统翻译enum(即通过QMetaEnum)的字符串表示?

我认为我需要某种方法,以获取lupdate来拾取枚举字符串以进行翻译,要么在且仅当lupdate处理文件或通过修改文件的行为时,要么通过发出一些qt_tr_noop()代码来进行翻译。 lupdate/ moc本身。

例如,我的应用程序通过对话框向用户提供了"设置"选项。所有设置均定义为Q_PROPERTY s。使用enum的选项作为组合框出现,并且组合框的文本选项使用QMetaEnum::key()作为显示的文本。以下是一些伪代码,可以跨越点。

小部件将具有一些enum属性,例如:

class SomeWidget : public QWidget
{
    Q_OBJECT
    Q_ENUMS( Configuration );
    enum Configuration
    {
        Config_Blue = 0,
        Config_Green,
        Config_Invisible,
        Config_Backwards
    };
    Q_PROPERTY( Configuration READ Configuration WRITE SetConfiguration );
};

组合小部件的创建是由单独的设置管理器完成的,并进行类似的操作:

QWidget* SettingsItem::CreateWidget()
{
    const QMetaObject* pMetaObj = this->m_pWidget->metaObject();
    const QMetaProperty& rcProp = pMetaObj->property( this->m_iProp );
    QMetaEnum cEnum = rcProp.enumerator();
    if( cEnum.isValid() )
    {
        QComboBox* pRetWidget = new QComboBox;
        for( int i = 0; i < cEnum.keyCount(); ++i )
        {
            int iVal = cEnum.value( i );
            QString strKey = cEnum.key( i );  // Translate here?
            pRetWidget->addItem( strKey, iVal );
        }
    } 
    ...
    return pRetWidget;
}

"设置"对话框中的组合框显示" config_blue"," config_green"等。我希望它只是说"蓝色","绿色"等。

在其余代码中,我们使用QT的翻译系统和linguist实用程序,该实用程序非常好。我希望我也可以为enum启用这种类型的翻译,而无需将字符串文字和tr()的s添加到代码中。基本上,翻译器所需的所有信息已经在代码中存在,我只需要linguist即可能够将这些枚举值识别为可转换的值。然后,我可以在组合框时调用tr()

我认为我需要某种方法,以获取lupdate来拾取枚举字符串以进行翻译,要么通过发射一些qt_tr_noop()代码,并且仅当lupdate处理文件或通过修改文件的行为时lupdate/moc本身。

我认为也许宏可能会起作用,但是可能是不可能的。也许需要修改一些QT代码?

一开始,枚举标识符不应是用户可见的。这些是对开发人员而不是用户的标识符。将它们直接暴露于用户,在代码的内部设计和用户可见的行为之间添加了强大的耦合。最好避免。

您需要在枚举值和用户可见字符串之间映射。地图中的值应经过翻译,并且在翻译后应重新填充地图。例如:

class Object : public QObject
{
    Q_OBJECT
    Q_ENUMS(Configuration);
    Q_PROPERTY(Configuration READ Configuration WRITE SetConfiguration);
    enum Configuration {
        Config_Blue, Config_Green, Config_Invisible, Config_Backwards
    };
public:
    static QString toString(Configuration c) {
      switch (c) {
      case Config_Blue: return tr("Blue", "Configuration");
      case Config_Green: return tr("Green", "Configuration");
      case Config_Invisible: return tr("Invisible", "Configuration");
      case Config_Backwards: return tr("Backwards", "Configuration");
      }
    }
};

您现在可以翻译配置值。

我正在使用定义枚举的类中的专用功能。有帮助吗?(QT5.13)。

我称其为myClass :: totrstring(myenumval);

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);
    enum MyEnum {
            myKey1,
            myKey2,
            ...
    };
    Q_ENUM(MyEnum)
    static QString toTrString(MyEnum t) {
        return tr(qPrintable(QVariant::fromValue(t).toString()));
    }
}