在上一篇文章中就提到过,使用qtpropertybrowser来加载属性,对应加载到的属性是英文的,也就是控件类中Q_PROPERTY描述的变量名称,如何变成中文或者其他语言显示呢?这个就需要研究qtpropertybrowser的源码了,通过研究发现,在QtObjectControllerPrivate类中负责对控件的属性名称进行遍历,然后发送到QtVariantPropertyManager进行统一的管理,那只要将这里的属性名称进行映射就行了,对应的英文到中文或者其他语言都可以,甚至枚举值的下拉框也可以在这里换成中文的。曾经想过用翻译的机制,后面发现路很漫长,而且最终还是需要映射转换,看过QtDesigner的源码,里边最终也是将翻译文件中的对应项转换成中文的。
#pragma execution_character_set("utf-8")
#include "qtpropertyname.h"
#include "qstringlist.h"
#include "qfile.h"
#include "qdebug.h"
QMap<QString, QString> QtPropertyName::maps = QMap<QString, QString>();
void QtPropertyName::initMap()
{
//从文件加载英文属性与中文属性对照表
QFile file(":/propertyname.txt");
if (file.open(QFile::ReadOnly)) {
//QTextStream方法读取速度至少快30%
#if 0
while(!file.atEnd()) {
QString line = file.readLine();
appendMap(line);
}
#else
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
appendMap(line);
}
#endif
file.close();
}
}
void QtPropertyName::appendMap(const QString &data)
{
QString line = data;
//过滤注释等
if (line.contains("#") || line.contains("//")) {
return;
}
line = line.trimmed();
line = line.replace("\r", "");
line = line.replace("\n", "");
if (!line.isEmpty()) {
QStringList list = line.split(",");
if (list.count() == 2) {
QString key = list.at(0).trimmed();
QString value = list.at(1).trimmed();
//都不能为空
if (!key.isEmpty() && !value.isEmpty()) {
maps.insert(key, value);
}
}
}
}